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

相關文章
相關標籤/搜索