2019独角兽企业重金招聘Python工程师标准>>>
在Tkinter的GUI应用中,经常会遇到耗时较长的任务。如界面上一个按键开启任务,任务中一些数据需要显示到界面上,用户可以用另一个中止按键停止任务执行。为了避免界面长时间僵住,所以通常开启一个工作线程,在后台执行,这时应涉及到及界面线程的交互。
Python要求不要在非GUI线程的环境下调用Tkinter的函数和对象,所以在后台线程中使用root.event_generator也是不安全的,可以在一定情况下引起程序crash。
经过证明可用的方法是:
1、使用一个Queue作为线程间的交互媒介。 queue = Queue.Queue()
2、定义消息类型,如MESSAGE_LOG='log' MESSAGE_EXIT='exit' MESSAGE_CANCEL='cancel'
3、在工作线程中,将发送的消息放入Queue。
while running:
...
queue.put_nowait([MESSAGE_LOG,"xxxxxxxxxx"])
4、在GUI线程开启一个定时任务。root.after(100, periodic_call)。
5、在periodic_call中,处理所有的queue中已有的消息。
try:
while True:
[code,item] = queue.get_nowait()
...
process
...
except Queue.Empty:
pass
6、如果需要中止线程,则在GUI线程中设置running的值为False。