我有一个已经很大的Tkinter程序,所以我有一个初始化文件,定义了root = Tk()窗口(基本上包含Text小部件和其他一些东西),还有更多代码,最后调用mainloop()功能。

一切正常,直到我需要在mainloop之前调用过程,并且我想在开始时升高wait窗口,并在过程结束时销毁。

我写了类似的东西:

msg = Message(root, text='wait a few seconds...')
msg.pack()


但是它没有作用,因为mainloop()还没有被调用!

如果我改为:

msg = Message(root, text='wait a few seconds...')
msg.pack()
mainloop()


程序在第一个mainloop处停止,未完成过程调用。

mainloop()应该用作最后一个程序行,之后Tkinter程序将由用户单击和交互等驱动的逻辑工作。

在这里,我需要一个序列的引发窗口>做东西>销毁窗口>主循环

最佳答案

您的程序初始化后,需要一次调用mainloop是正确的。这是启动事件循环所必需的,对于Windows绘制自身,响应事件等而言,这是必需的。

您可以做的是将初始化分为两部分。第一个-创建等待窗口-发生在启动事件循环之前。第二个-完成其余的初始化-一旦事件循环开始发生。您可以通过after方法安排第二阶段来做到这一点。

这是一个简单的示例:

import Tkinter as tk
import time

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):

        # initialize Tkinter
        tk.Tk.__init__(self, *args, **kwargs)

        # hide main window
        self.wm_withdraw()

        # show "please wait..." window
        self.wait = tk.Toplevel(self)
        label = tk.Label(self.wait, text="Please wait...")
        label.pack()

        # schedule the rest of the initialization to happen
        # after the event loop has started
        self.after(100, self.init_phase_2)

    def init_phase_2(self):

        # simulate doing something...
        time.sleep(10)

        # we're done. Close the wait window, show the main window
        self.wait.destroy()
        self.wm_deiconify()

app = SampleApp()
app.mainloop()

关于python - Tkinter:一个或多个主循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7499923/

10-12 14:24
查看更多