此问题与此问题不重复: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方法永远不会被调用,因为程序继续以无限循环运行并且永远不会退出,无论按下什么键。谢谢!
答案 0 :(得分:0)
问题可能是由于两件事。没有看到你的所有代码,就无法肯定地说出来。
首先,你绑定了一个资本&#34; A&#34;而不是小写&#34; a&#34; - 当您按下大写A?
时,您是否测试过绑定是否有效?此外,您错误地使用了after
和update
。您可能会使事件循环挨饿,从而阻止其处理按键操作。定期运行函数的正确方法是使用(重新)自我调度的函数。
class CPU_Class():
...
def run_cycle(self):
self.emulate_cycle()
self._root.after(1, self.run_cycle)
有两点需要注意:
after(0, ...)
- 您需要至少提前一个小时才能处理其他事件。一旦这样做,您就不再需要while
循环了。您只需调用run_cycle
一次,即可启动CPU运行。