[英]Tkinter Frame Not Recognizing Keypresses
這個問題不是這個問題的重復: 為什么.bind()方法不能與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方法,因為該程序將繼續在無限循環中運行,並且無論按下什么鍵,都不會退出。 謝謝!
問題可能是由於兩件事。 如果沒有看到所有代碼,就無法確定。
例如,您要綁定到大寫字母“ A”,而不是小寫字母“ a”-您是否在按大寫字母A時測試了綁定是否起作用?
此外,您正在使用after
並且錯誤地update
。 您可能會餓死事件循環,從而阻止其處理按鍵操作。 定期運行一個函數的正確方法是擁有一個(重新)計划自身的函數。
class CPU_Class():
...
def run_cycle(self):
self.emulate_cycle()
self._root.after(1, self.run_cycle)
有兩件事要注意:
after(0, ...)
-您需要給tkinter至少一個ms左右的時間來處理其他事件。 一旦這樣做,就不再需要while
循環。 您只需調用一次run_cycle
即可開始CPU運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.