我正在嘗試構建一個程序,用於偵聽特定的組合鍵,然後在Tkinter窗口中向用戶顯示信息。要做到這一點,我使用的是像這樣一個鍵盤記錄器(簡化這個例子):將Tkinter主循環與另一個事件偵聽器相結合
from pyHook import HookManager
from pythoncom import PumpMessages
import Tkinter as tk
def on_keyboard_event(event):
label.config(text=event.Key)
root.update()
return True
hm = HookManager()
hm.KeyDown = on_keyboard_event
hm.HookKeyboard()
root = tk.Tk()
label = tk.Label(root, text='Hello world')
label.pack()
PumpMessages()
正如預期的那樣,窗口彈出,並顯示它們按什麼鍵的用戶。但是,我想集成功能來通過與Tkinter窗口交互來顯示其他消息,例如通過按下按鈕。然而,似乎我需要Tkinter的主循環來做到這一點,我不知道如何與PumpMessages()一起運行,因爲它也停止了類似於mainloop()的代碼。
我想在一個root.after()運行root.mainloop(),我試圖重建root.mainloop像這樣:
def mainloop():
root.update()
root.after(50, mainloop)
,然後PumpMessages前右行駛,但這些方法都工作。它似乎也不像你可以在一個線程中運行PumpMessages或root.mainloop,但我可能不會做正確的。如果Tkinter無法實現這個功能,那麼是否有可以使用的替代Python GUI呢?
不幸的是,這是行不通的。如果我把mainloop()放在最後,它永遠不會到達,因爲代碼永遠不會經過PumpMessages()。如果我在此處顯示後使用,界面在啓動主循環後就變得無響應。編輯 - 實際上,它似乎沒有達到主循環,所以PumpMessages()必須防止執行它的函數。 –
您是否曾嘗試在PumpMessages()前運行主循環() – Jake
呵呵。這似乎工作,雖然代碼永遠不會到達PumpMessages(),所以不能是鍵盤記錄器的必要組成部分。這並不完全回答這個問題,但我想它是有效的。 –