2016-09-28 86 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

相关问题