Python Tkinter:一个或多个主回路?
我有一个已经很大的Python Tkinter:一个或多个主回路?,python,tkinter,Python,Tkinter,我有一个已经很大的Tkinter程序,因此我有一个init文件,其中定义了root=Tk()窗口(基本上包含一个文本小部件和一些其他东西),还有一些代码,最后调用mainloop()函数 一切都正常,直到我需要在mainloop之前调用一个过程,我想在开始时启动一个wait窗口,在过程结束时销毁它 我写了这样的东西: msg = Message(root, text='wait a few seconds...') msg.pack() 但是它不工作,也不能工作,因为还没有调用mainloop
Tkinter
程序,因此我有一个init文件,其中定义了root=Tk()
窗口(基本上包含一个文本
小部件和一些其他东西),还有一些代码,最后调用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程序通过用户单击和交互等驱动的逻辑工作
在这里,我需要一系列的raise window>do stuff>destroy window>mainloop您应该使用Tkinter的方法来运行asyncore的循环函数,但是您应该使用asyncore.poll(0)而不是asyncore.loop()。如果每x ms调用函数asyncore.poll(0),它将不再对Tkinter的主循环产生影响。您应该使用Tkinter的方法来运行asyncore的循环函数,但应该使用asyncore.poll(0)而不是asyncore.loop()。如果每x ms调用函数asyncore.poll(0),它将不再对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()
在程序初始化后,需要调用一次
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()
正如我告诉你的,我是一个Tkinter新手,所以我从来没有听说过asyncore。。。我看到文档没有提到它,而我的最终资源(effbot)在这里说了些什么。。。我更喜欢更简单的,我原来的问题似乎没有那么复杂,需要这样的工作!也许这可以解决您的问题:正如我告诉您的,我是Tkinter新手,所以我从未听说过asyncore。。。我看到文档没有提到它,而我的最终资源(effbot)在这里说了些什么。。。我更喜欢更简单的,我原来的问题似乎没有那么复杂,需要这样的工作!也许这可以解决您的问题: