我有一个已经很大的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/