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

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

相关文章
相关标签/搜索