2016-09-28 84 views
0

假設我有一個方法在TKinter中按下按鈕時運行。這種方法打開一個外部應用程序(即Excel,Powerpoint等,我的程序打開的應用程序需要更長的時間才能打開,這就是爲什麼我需要加載對話框)如何在沒有GUI凍結的情況下從TKinter運行方法?

我想打開一個小小的自定義tk.toplevel loading會在外部應用程序加載時顯示並且takefocus

但是,只要TKinter運行打開應用程序的方法,整個事情就會凍結,我的加載對話框只有在應用程序最終打開後纔可見。

有沒有辦法顯示我的加載對話框,同時在後臺打開應用程序?

回答

1

不是在同一時間。首先打開對話框,然後調用打開其他應用程序的方法。您必須通過在凍結GUI的方法之前調用update_idletasks來強制執行對話框的繪製,否則在程序閒置之前不會繪製對話框,並且太晚了。

在這個例子中,我使用time.sleep來模擬一個任務,以保持應用程序的繁忙和GUI的凍結。

import time 
import tkinter as tk 


class App(): 
    def __init__(self): 
     self._root = tk.Tk() 
     b = tk.Button(self._root, text='Click me', command=self.onclick) 
     b.pack() 

    def run(self): 
     self._root.mainloop() 

    def onclick(self): 
     dialog = tk.Toplevel(self._root) 
     tk.Label(dialog, text='Loading...').pack() 
     dialog.update_idletasks() 
     self.this_takes_a_long_time() 
     dialog.destroy() 

    def this_takes_a_long_time(self): 
     time.sleep(5) 


App().run() 
+0

我試過了,加載對話框在應用程序打開後仍然顯示。也許是因爲這兩種方法都在'try:'語句下?不確定。 – RBuntu

+0

重新嘗試在'try:open_external_application()'語句之外調用'tk.toplevel'。仍然不起作用。 – RBuntu

+0

@Runtunt您必須強制重新繪製GUI,請參閱示例。 – Goyo

相關問題