2011-09-21 100 views
1

我有一个已经很大Tkinter程序,让我有一个初始化文件,其中定义了root = Tk()窗口(含基本上是Text小部件和其他一些东西),多了一些代码,最后调用mainloop()功能。Tkinter:一个或多个主循环?

一切正常,直到我需要的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程序的工作原理是通过用户点击和交互驱动的逻辑等

在这里,我需要提高窗口的序列>做的东西>破坏窗口>主循环

回答

1

在程序初始化后,您无需调用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() 
0

您应该使用Tkinter的方法来运行异步的循环函数,但是应该使用asyncore.poll(0)而不是asyncore.loop()。如果每x毫秒调用函数asyncore.poll(0),它将不再对Tkinter的主循环产生影响。

+0

因为我告诉你,我是一个新手Tkinter的,所以我从来没有听说过asyncore ...我看到的文档http://infohost.nmt.edu/ tcc/help/pubs/tkinter /不提及它,而我的最终资源(effbot)在这里说了些什么http://effbot.org/zone/asyncore.htm ...我宁愿更容易些,我原来的问题没有看起来很复杂,需要这样的工作! – alessandro

+0

也许这可以解决您的问题:[点击我!](http://stackoverflow.com/questions/459083/how-do-you-run-your-own-code-alongside-tkinters-event-loop ) – jermenkoo