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()