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()