如何在没有GUI冻结的情况下从TKinter运行方法?

时间:2016-09-28 19:36:14

标签: python-2.7 tkinter tk

假设我有一个在TKinter中按下按钮时运行的方法。这个方法打开了一个外部应用程序(即Excel,Powerpoint等。我的程序打开的应用程序需要更长时间才能打开,这就是我需要加载对话框的原因)

我正在尝试打开一个小的自定义tk.toplevel加载对话框,该对话框将在外部应用程序加载时显示和takefocus

但是,每当TKinter运行打开应用程序的方法时,整个事情就会冻结,我的加载对话框只有在应用程序最终打开后才能看到。

有没有办法显示我的加载对话框,同时在后台打开应用程序?

1 个答案:

答案 0 :(得分: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()