Python 根目录更新
为什么在销毁窗口时使用Python 根目录更新,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,为什么在销毁窗口时使用root.update()出现此错误: _tkinter.TclError: invalid command name ".!label" 或 下面是一个示例代码: from tkinter import * import random r=Tk() a=Label(r) b=[1,2,3,4,5,6,7] while(True): a.configure(text=f'{random.choice(b)}') a.pack()
root.update()
出现此错误:
_tkinter.TclError: invalid command name ".!label"
或
下面是一个示例代码:
from tkinter import *
import random
r=Tk()
a=Label(r)
b=[1,2,3,4,5,6,7]
while(True):
a.configure(text=f'{random.choice(b)}')
a.pack()
r.update()
r.mainloop()
有没有办法修复此错误?此错误是因为您正在运行一个无限循环 关闭窗口后,循环也会尝试运行程序并尝试访问Tk()窗口,但它已被销毁 解决方法是在关闭窗口时也打破循环
try:
a.configure(text=f'{random.choice(b)}')
r.update()
except:
break
在上面的代码中,程序将尝试访问该窗口,如果成功,它将运行该程序
否则失败,它将执行“除外”条件并中断循环
您的完整代码将被删除
from tkinter import *
import random
r=Tk()
a=Label(r)
a.pack()
b=[1,2,3,4,5,6,7]
while(True):
try:
a.configure(text=f'{random.choice(b)}')
r.update()
except:
break
r.mainloop()
当您关闭tkinter窗口并且有未完成的操作等待处理时,就会发生这种情况或类似情况。坦白地说,它可以被忽略 …但是,如果你真的想摆脱它,你需要管理你正在进行的过程,并等待它们在结束时完成。您需要在Tk类的自定义版本中覆盖destroy()方法才能实现这一点,如果您希望程序继续运行活动进程,那么最好使用after()。按照您现在的方式,它永远不会进入主循环,因此某些功能将无法工作 以下是一个简单的修复方法:
from tkinter import *
import random
class Globals:
stop = False
class MyTk(Tk):
def trueDestroy(self):
Tk.destroy(self)
def destroy(self):
Globals.stop = (self)
def myUpdate():
a.configure(text=f'{random.choice(b)}')
if Globals.stop:
r.trueDestroy()
else:
r.after(1, myUpdate)
r=MyTk()
a=Label(r)
a.pack()
b=[1,2,3,4,5,6,7]
r.after(1, myUpdate)
r.mainloop()
实际上,您应该为正在运行的每个进程创建一个队列,而不仅仅是一个“停止”函数,然后在所有进程都停止后才将其销毁,但希望您可以从中推断出来。现在还可以,但使用
while
循环最终会导致窗口在拖动窗口或调整窗口大小时没有响应,请考虑使用<代码>()<代码>。但是,这里的错误是因为<<代码> 循环没有结束,但是<代码>主环()/代码>结束,标签被破坏,当<代码>主环()/代码>结束时,但仍然<代码>,而循环仍然用标签运行,当“代码>主环())被破坏时,循环被破坏。结束,因此出现错误,。!标签
找不到很好的解释,谢谢
from tkinter import *
import random
class Globals:
stop = False
class MyTk(Tk):
def trueDestroy(self):
Tk.destroy(self)
def destroy(self):
Globals.stop = (self)
def myUpdate():
a.configure(text=f'{random.choice(b)}')
if Globals.stop:
r.trueDestroy()
else:
r.after(1, myUpdate)
r=MyTk()
a=Label(r)
a.pack()
b=[1,2,3,4,5,6,7]
r.after(1, myUpdate)
r.mainloop()