Tkinter t怠速后停止最高液位

Tkinter t怠速后停止最高液位,tkinter,Tkinter,当我设置root.after_idle()时,它会停止顶层运行 from Tkinter import * blah=1 def afterloop(): label.config(text=str(blah)) root.after(500,afterloop) def idleloop(): global blah blah=blah+1 if blah<500000: root.after_idle(idleloop) d

当我设置root.after_idle()时,它会停止顶层运行

from Tkinter import *
blah=1

def afterloop():
    label.config(text=str(blah))
    root.after(500,afterloop)

def idleloop():
    global blah
    blah=blah+1
    if blah<500000:
        root.after_idle(idleloop)

def second():
    spam=Toplevel()
    button2=Button(spam,text="Button 2",command=spam.destroy)
    button2.pack()

root=Tk()
button1=Button(root,text="Press to Open",command=second)
button1.pack()
label=Label(root,text="*********************")
label.pack()
root.update()
root.after_idle(idleloop)
root.after(500,afterloop)
root.mainloop()
从Tkinter导入*
布拉赫=1
def afterloop():
label.config(text=str(blah))
根。后(500,后循环)
def idleloop():
全球废话
废话=废话+1
如果blah500000(根据您的机器速度进行调整),则所有机器均按预期开始工作。我阅读文档的方式是,只有在没有其他事情做的情况下,才应该在空闲后运行。在这种情况下,它似乎阻止了Toplevel的处理

在现实生活中,idletask是一个相当大的状态机,它向加工中心读写数据。我知道有人会建议我使用root.after()。我是,出于其他目的。这段代码只是演示问题的最起码的代码。在调用顶层之前,这对我想要的东西非常有效。您将注意到空闲任务仍在运行,因为它最终会达到500000并停止


将idletask移动到单独的线程是可能的,但在这一点上是非常不希望的。

在空闲后使用
是不正确的方法。至少你需要给它一毫秒的通话间隔。否则,事件循环就没有机会处理任何其他事件。发生的情况是,在第一次检查空闲后,它查看空闲回调列表。如果那里有什么东西,它就叫它。然后,它会寻找更多要做的事情,并一直持续到回调列表为空为止。只有这样,它才能恢复到处理正常事件的状态


然而,由于您不断地向要做的事情列表中添加一些事情,空闲进程实际上是在追逐它自己的尾巴。它从队列中取出一个项目并执行,这会将某个项目推到队列中。然后,它将该项提取并执行,从而将其推到队列中,依此类推。实际上,当它空闲时,你有一个无限的清单,上面列出了它应该做的事情,而它在放弃控制权之前会尝试去做这些事情

好的,我完全理解。我还有两个问题要问。为什么根窗口上的小部件继续工作?更重要的是,我是否理解只有在通过mainloop()的过程中没有其他操作时,才会调用after_idle。