Search code examples
pythontkintercanvasmovetkinter-canvas

tkinter (python): assign class method to a key


In my simple code, a red ball is falling down in a straight line (that's working). When I push the right arrow key, I want the ball to also move in right direction. This is not working, however. What am I doing wrong?

from tkinter import *

root = Tk()

canvas = Canvas(root, height=400, width=500, background='black')
canvas.pack()


class Bird:
    def __init__(self, canvas, coords):
        self.canvas = canvas
        self.coords = coords
        self.bird = canvas.create_rectangle(coords, fill='red')

    def gravity(self):
        self.canvas.move(self.bird, 0, 10)
        self.canvas.after(200, self.gravity)

    def moveRight(self, event):
        self.canvas.move(self.bird, 10, 0)
        self.canvas.after(200, self.moveRight)

bird = Bird(canvas, (100, 100, 110, 110))

bird.gravity()

canvas.bind('<Right>', bird.moveRight)

root.mainloop()

I have another additional question:

Is it possible to call this "after"-function or a similar function for the whole canvas instead of the two methods separately?

If you see any other flaws with my code plz let me know!

Thanks!


Solution

  • You must bind the right key to the canvas inside the class, and set the focus on the canvas:

    from tkinter import *
    
    root = Tk()
    
    canvas = Canvas(root, height=400, width=500, background='black')
    canvas.pack()
    
    
    class Bird:
        def __init__(self, canvas, coords):
            self.canvas = canvas
            self.coords = coords
            self.bird = canvas.create_rectangle(coords, fill='red')
            self.canvas.bind('<Right>', self.moveRight)
            self.canvas.focus_set()
    
        def gravity(self):
            self.canvas.move(self.bird, 0, 10)
            self.canvas.after(200, self.gravity)
    
        def moveRight(self, event=None):
            self.canvas.move(self.bird, 10, 0)
            self.canvas.after(200, self.moveRight)
    
    
    bird = Bird(canvas, (100, 100, 110, 110))
    
    bird.gravity()
    
    root.mainloop()