在Tkinter的GUI應用中,常常會遇到耗時較長的任務。如界面上一個按鍵開啓任務,任務中一些數據須要顯示到界面上,用戶能夠用另外一個停止按鍵中止任務執行。爲了不界面長時間僵住,因此一般開啓一個工做線程,在後臺執行,這時應涉及到及界面線程的交互。安全
Python要求不要在非GUI線程的環境下調用Tkinter的函數和對象,因此在後臺線程中使用root.event_generator也是不安全的,能夠在必定狀況下引發程序crash。
函數
通過證實可用的方法是:
線程
一、使用一個Queue做爲線程間的交互媒介。 queue = Queue.Queue()code
二、定義消息類型,如MESSAGE_LOG='log' MESSAGE_EXIT='exit' MESSAGE_CANCEL='cancel'對象
三、在工做線程中,將發送的消息放入Queue。get
while running: generator
... it
queue.put_nowait([MESSAGE_LOG,"xxxxxxxxxx"])io
四、在GUI線程開啓一個定時任務。root.after(100, periodic_call)。event
五、在periodic_call中,處理全部的queue中已有的消息。
try:
while True:
[code,item] = queue.get_nowait()
...
process
...
except Queue.Empty:
pass
六、若是須要停止線程,則在GUI線程中設置running的值爲False。