首页 > 解决方案 > 为什么键绑定在 macOS 上不起作用?

问题描述

一位朋友发现更改第 7 行的绑定 from'w''s'to'Left'并且'Right'工作得很好,但找不到任何其他字符串可以让绑定正常工作。我没有个人访问 macOS 计算机来调试程序的权限。有人可以解释为什么该程序可以在 Windows 上运行,以及需要做什么才能使其在 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()

标签: pythonpython-3.xmacostkintertkinter-canvas

解决方案


推荐阅读