Python Tkinter错误

Python Tkinter错误,python,tkinter,Python,Tkinter,我设计了一个可以旋转的圆弧,但我不明白为什么IDLE告诉我代码中仍然存在错误 这是我的密码: from Tkinter import* from math import * from time import sleep pai=Tk() cv=Canvas(pai,width=1100,height=631,bg="white") cv.pack() bb=(150,110,550,510) temp1=0 temp2=24 t=0 arc1=cv.create_arc(bb,start=tem

我设计了一个可以旋转的圆弧,但我不明白为什么IDLE告诉我代码中仍然存在错误

这是我的密码:

from Tkinter import*
from math import *
from time import sleep
pai=Tk()
cv=Canvas(pai,width=1100,height=631,bg="white")
cv.pack()
bb=(150,110,550,510)
temp1=0
temp2=24
t=0
arc1=cv.create_arc(bb,start=temp1,extent=temp2,fill="yellow")
while True:
    t=0.51
    temp1+=t
    cv.itemconfig(arc1,start=temp1)
    cv.update()
这是:

回溯(最近一次呼叫最后一次):
文件“C:\Users\amazi\Desktop\作业\s、 “py”,第15行,英寸
cv.itemconfig(arc1,start=temp1)
文件“C:\Python27\lib\lib tk\Tkinter.py”,第2408行,在itemconfigure中
返回自配置(('itemconfigure',tagOrId),cnf,kw)
文件“C:\Python27\lib\lib tk\Tkinter.py”,第1321行,在_configure中
self.tk.call(_flatten((self._w,cmd))+self._选项(cnf))
Tcl错误:无效的命令名“.93591304L”

在我看来,您的代码在运行时运行得很好——问题在于它刚刚结束。当你关闭应用程序时,它是否给出了该错误

我修改了
,而True:
块为
,用于范围(500):
中的I,以验证这一点,并且只要您的循环不希望继续,它就会完美关闭

以下是两种可能的解决方法:

最简单的方法是捕捉错误:

from Tkinter import*

pai=Tk()
cv=Canvas(pai,width=1100,height=631,bg="white")
cv.pack()
bb=(150,110,550,510)
temp1=0
temp2=24
t=0
arc1=cv.create_arc(bb,start=temp1,extent=temp2,fill="yellow")
while True:
    t=0.51
    temp1+=t
    try:
        cv.itemconfig(arc1,start=temp1)
        cv.update()
    except TclError:
        pass
pai.mainloop()
困难的是,不要让错误发生(给gui一秒钟的时间来赶上):


就我个人而言,虽然我通常不建议捕捉错误,但我不赞成第二种选择。基本上,我在那里做的是创建一个变量,告诉while循环是否应该继续,然后单击close按钮更新while结束。在我看来,无限while循环是这里的主要问题。一旦它结束,GUI可以完成,一切都会解决。

我相信您会遇到这个错误,因为您试图在没有小部件的情况下访问小部件,类似于。当您使用x按钮关闭应用程序时,
while True
循环尝试在不存在的小部件上至少运行一次,从而产生错误。如果通过关闭命令提示符来关闭应用程序,则不会产生错误,如,它应该出现在何处?尝试下面的示例,该示例完全按照您想要的方式设置动画,但没有
while True
循环,这在tkinter中并不容易使用:

import tkinter as tk
root = tk.Tk()
cv = tk.Canvas(root, width=1100, height=631, bg='white')
cv.pack()
bb = (150,110,550,510)
temp1 = 0
temp2 = 24
arc1=cv.create_arc(bb, start=temp1, extent=temp2, fill='yellow')

def rotate():
    global temp1
    t = 0.51
    temp1 = (temp1 + t) % 360
    print(temp1)
    cv.itemconfig(arc1,start=temp1)
    cv.update_idletasks()
    cv.after(0, rotate)

cv.after(0, rotate)
root.mainloop()
使用下面的建议,可能会产生另一个示例。在下面的示例中,您可能需要调整
t

import tkinter as tk
root = tk.Tk()
cv = tk.Canvas(root, width=1100, height=631, bg='white')
cv.pack()
bb = (150,110,550,510)
temp1 = 0
temp2 = 24
arc1=cv.create_arc(bb, start=temp1, extent=temp2, fill='yellow')

def rotate():
    global temp1
    t = 1
    temp1 = (temp1 + t) % 360
    print(temp1)
    cv.itemconfig(arc1,start=temp1)
    cv.after(1, rotate)

rotate()
root.mainloop()

不要附加代码的图像。将其放在此处使用
tkintet.after()
而不是
,而
空闲
是使用
tkinter
构建的,因此有时使用
tkinter
的代码会出现问题。在console/terminal/cmd.exe中运行代码来测试它。可能是Ya的重复,那个错误让我很困惑。运行时一切正常,但最终会出错。但是如果我像你说的那样添加“pai.mainloop()”,错误仍然存在。pai.mainloop()并不是为了修复错误,只是一个一般性的建议。该错误源于它在运行时终止。在我看来,这不是一个太大的错误。如果你想修复它,你可以试着抓住它,除了块。主循环与您的程序能够处理事件有关。您的程序不会因为缺少它而遭受太多的痛苦,但是拥有它是一个很好的实践。(我忘记了,并且很困惑没有让我的事件工作)在(0,…)之后使用
是个坏主意。第一个参数应该至少是1(一)`否则您可能会阻止处理任何其他事件。另外,如果进行了更改,您可以删除对
update\u idletasks()
的调用。@BryanOakley我尝试使用1,但放弃了它,因为它看起来比OP的动画慢。然后,我想可以再次使用
t
来调整它。我还没有运行它,但我会使用@Nae的第二个建议(使用Bryan Oakley的建议)。更加优雅。除非你真的不在乎(因为在应用程序关闭后发生的错误实际上不会影响任何事情。那么我只想用try-except来结束这一天;-)+1表示我的Nae
import tkinter as tk
root = tk.Tk()
cv = tk.Canvas(root, width=1100, height=631, bg='white')
cv.pack()
bb = (150,110,550,510)
temp1 = 0
temp2 = 24
arc1=cv.create_arc(bb, start=temp1, extent=temp2, fill='yellow')

def rotate():
    global temp1
    t = 0.51
    temp1 = (temp1 + t) % 360
    print(temp1)
    cv.itemconfig(arc1,start=temp1)
    cv.update_idletasks()
    cv.after(0, rotate)

cv.after(0, rotate)
root.mainloop()
import tkinter as tk
root = tk.Tk()
cv = tk.Canvas(root, width=1100, height=631, bg='white')
cv.pack()
bb = (150,110,550,510)
temp1 = 0
temp2 = 24
arc1=cv.create_arc(bb, start=temp1, extent=temp2, fill='yellow')

def rotate():
    global temp1
    t = 1
    temp1 = (temp1 + t) % 360
    print(temp1)
    cv.itemconfig(arc1,start=temp1)
    cv.after(1, rotate)

rotate()
root.mainloop()