[python]tkinker的GUI应用执行耗时长的任务

Tkinter多线程实践
本文介绍如何在Tkinter GUI应用程序中实现多线程处理,包括通过Queue进行线程间通信的方法,以及如何安全地更新GUI组件,确保主线程与工作线程之间的稳定交互。

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


      


转载于:https://my.oschina.net/u/136074/blog/603248

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值