我有一个使用Tkinter作为GUI的Python脚本。我的小脚本应该每隔X秒创建一个Toplevel小部件。当我运行我的代码时,第一个Toplevel小部件已成功创建,但当它尝试创建第二个时,程序崩溃。创建第二个Toplevel小部件时,Threaded Tkinter脚本崩溃
我正在做的是使用after方法每5秒调用一次函数startCounting以及root的主循环。每次调用该函数时,我都会将一个Toplevel Widget对象添加到列表中,并启动一个新线程,希望能够运行新的主循环。
如果有人能够解决这个问题,我将不胜感激。顺便说一下,这只是我目前用来解决我的问题的一个小脚本,它阻止了我继续我的真实学校项目。
代码:
import threading,thread
from Tkinter import *
def startCounting():
global root
global topLevelList
global classInstance
topLevelList.append (Toplevel())
topLevelList[len(topLevelList)-1].title("Child")
classInstance.append(mainLoopThread(topLevelList[len(topLevelList)-1]))
root.after(5000,startCounting)
class mainLoopThread(threading.Thread):
def __init__(self,toplevelW):
self.toplevelW = toplevelW
threading.Thread.__init__(self)
self.start()
def run(self):
self.toplevelW.mainloop()
global classInstance
classInstance = []
global topLevelList
topLevelList = []
global root
root = Tk()
root.title("Main")
startCounting()
root.mainloop()
感谢您的快速答复。我会检查文档。欢迎使用 – user430825 2010-08-25 15:07:05
@user! – 2010-08-25 15:13:59
我遇到过这个限制,这正是我使用的策略。我有一种方法可以检查所有队列。然后,我通过调用root.after(ms,my_method)将该方法注册到Tkinter的主循环中。my_method中的最后一次调用是对root.after的另一次调用,以便my_method不断向主循环重新注册自己。重要的是,my_method中的异常不会导致您错过向主循环注册。你可能想把你的调用root.after放到try/finally的finally部分。 – 2010-08-25 15:17:42