簡體   English   中英

Tkinter框架無法識別按鍵

[英]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)

有兩件事要注意:

  1. 不要使用after(0, ...) -您需要給tkinter至少一個ms左右的時間來處理其他事件。
  2. run_cycle函數負責運行一個周期,然后安排下一個周期以在將來運行。

一旦這樣做,就不再需要while循環。 您只需調用一次run_cycle即可開始CPU運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM