Why do the key bindings not work on macOS?

Viewed 150

A friend discovered that changing the bindings on line 7 from 'w' and 's' to 'Left' and 'Right' worked just fine but could not find any other strings that would allow the binding to work properly. I do not have personal access to a macOS computer to debug the program. Could someone please explain why the program works on Windows and what needs to be done to get it to work as intended on macOS?

import tkinter


class Pong(tkinter.Canvas):
    def __init__(self):
        super().__init__(widt=640, heig=480, bg='black', highlightthickness=0)
        self.a, self.b = Pad(10, self, 'w', 's'), Pad(630, self, 'Up', 'Down')
        self.after_idle(self.animate)
        self.focus_force()

    def animate(self):
        self.a.move()
        self.b.move()
        self.delete(tkinter.ALL)
        self.a.render(self)
        self.b.render(self)
        self.after(10, self.animate)


class Pad:
    def __init__(self, alignment, surface, up, down):
        self.x, self.y = alignment, 240
        self.keys = KeyListener(surface, up=up, down=down)

    def move(self):
        if self.keys.up and self.y > 60:
            self.y -= 5
        if self.keys.down and self.y < 420:
            self.y += 5

    def render(self, surface):
        surface.create_rectangle(
            (self.x - 7, self.y - 60, self.x + 7, self.y + 60),
            fill='blue', outline='blue')


class KeyListener:
    def __init__(self, widget, **kwargs):
        self.__state = dict.fromkeys(kwargs, False)
        for name, key in kwargs.items():
            widget.bind('<KeyPress-{}>'.format(key), self.__set(name, True))
            widget.bind('<KeyRelease-{}>'.format(key), self.__set(name, False))

    def __set(self, name, value):
        def handler(_):
            self.__state[name] = value
        return handler

    def __getattr__(self, name):
        return self.__state[name]


if __name__ == '__main__':
    Pong().grid()
    tkinter.mainloop()
0 Answers
Related