在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。