Tkinter Frame无法识别Keypresses

时间:2015-04-26 03:24:29

标签: python tkinter

此问题与此问题不重复:Why doesn't the .bind() method work with a frame widget in Tkinter?

如您所见,我将焦点设置为我的game_frame()方法中的当前帧。

我正在用Python编写Chip-8仿真器并使用Tkinter作为我的GUI。模拟器正在运行,但我无法让Tkinter识别按键。这是我的代码:

def game_frame(self):
    self.screen = Frame(self.emulator_frame, width=640, height=320)
    self.screen.focus_set()
    self.canvas = Canvas(self.screen, width=640, height=320, bg="black")
    self._root.bind("<KeyPress-A>", self.hello)
    for key in self.CPU.KEY_MAP.keys():
        print(key)
        self.screen.bind(key, self.hello)
    self.screen.pack()
    self.canvas.pack()

def hello(self, event):
    if event.keysym in self.CPU.KEY_MAP.keys():
        self.CPU.keypad[self.CPU.KEY_MAP[event.keysym]] = 1
        self.CPU.key_pressed = True
        self.CPU.pc += 2
    sys.exit()

def run_game(self, event):
    self.game_frame()
    self.CPU.load_rom("TANK")
    while True:
        self._root.update()
        self.after(0, self.CPU.emulate_cycle)
你可以帮我弄清楚出了什么问题吗?我认为这可能与我的游戏循环干扰键绑定有关,但我不确定。当我运行游戏时,hello方法永远不会被调用,因为程序继续以无限循环运行并且永远不会退出,无论按下什么键。谢谢!

1 个答案:

答案 0 :(得分:0)

问题可能是由于两件事。没有看到你的所有代码,就无法肯定地说出来。

首先,你绑定了一个资本&#34; A&#34;而不是小写&#34; a&#34; - 当您按下大写A?

时,您是否测试过绑定是否有效?

此外,您错误地使用了afterupdate。您可能会使事件循环挨饿,从而阻止其处理按键操作。定期运行函数的正确方法是使用(重新)自我调度的函数。

class CPU_Class():
    ...
    def run_cycle(self):
        self.emulate_cycle()
        self._root.after(1, self.run_cycle)

有两点需要注意:

  1. 请勿使用after(0, ...) - 您需要至少提前一个小时才能处理其他事件。
  2. run_cycle函数负责运行一个循环,然后安排下一个循环以便将来运行。
  3. 一旦这样做,您就不再需要while循环了。您只需调用run_cycle一次,即可启动CPU运行。