2017-02-07 40 views
1

我正在嘗試構建一個程序,用於偵聽特定的組合鍵,然後在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呢?

回答

0

您不需要創建使用mainloop()的功能,只需將mainloop()放置在代碼的底部即可。如果你想在它的延遲,使用root.after(milliseconds, function)

另外,記得以前PumpMessages()

例如把mainloop()

def mainloopfunction(): 
    mainloop() 

root.after(5000, mainloopfunction) 

希望我能幫忙!

+0

不幸的是,這是行不通的。如果我把mainloop()放在最後,它永遠不會到達,因爲代碼永遠不會經過PumpMessages()。如果我在此處顯示後使用,界面在啓動主循環後就變得無響應。編輯 - 實際上,它似乎沒有達到主循環,所以PumpMessages()必須防止執行它的函數。 –

+0

您是否曾嘗試在PumpMessages()前運行主循環() – Jake

+0

呵呵。這似乎工作,雖然代碼永遠不會到達PumpMessages(),所以不能是鍵盤記錄器的必要組成部分。這並不完全回答這個問題,但我想它是有效的。 –

相關問題