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)在这里说了些什么。。。我更喜欢更简单的,我原来的问题似乎没有那么复杂,需要这样的工作!也许这可以解决您的问题: