2017-12-18 155 views
0

我設計了一個可以旋轉的弧線,但我無法弄清楚爲什麼IDLE告訴我在我的代碼中仍然存在錯誤。Python Tkinter TclError

這裏是我的代碼:

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

這是results

Traceback (most recent call last): 
    File "C:\Users\amazi\Desktop\作業\s.py", line 15, in <module> 
    cv.itemconfig(arc1,start=temp1) 
    File "C:\Python27\lib\lib-tk\Tkinter.py", line 2408, in itemconfigure 
    return self._configure(('itemconfigure', tagOrId), cnf, kw) 
    File "C:\Python27\lib\lib-tk\Tkinter.py", line 1321, in _configure 
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) 
TclError: invalid command name ".93591304L" 
+2

不重視代碼的圖像。將它放在這裏 –

+1

使用'tkintet.after()'而不是'while' – furas

+1

'IDLE'是用'tkinter'構建的,所以有時候會導致使用'tkinter'的代碼出現問題。在console/terminal/cmd.exe中運行代碼進行測試。 – furas

回答

0

在我看來,你的代碼,而它的運行運行正常 - 它只是結束這也就是問題。當你關閉應用程序時,它是否給出了這個錯誤?

我修改了while True:塊到for i in range(500):來驗證這一點,只要你的循環不期望繼續它完美關閉。

這裏有兩種可能的方式,你可以解決這個問題:

最簡單的辦法,捕獲錯誤:

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第二以追上):

import Tkinter as tk 

def on_closing(): 
    pai.cont = False 

pai = tk.Tk() 
pai.protocol("WM_DELETE_WINDOW", on_closing) 
cv = tk.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") 

pai.cont = True 
while pai.cont: 
    t=0.51 
    temp1+=t 
    cv.itemconfig(arc1,start=temp1) 
    cv.update() 

pai.destroy() 

雖然我個人通常不建議捕捉錯誤,我不會去第二個選項。基本上,我在那裏做的是創建一個變量,告訴while循環是否應該繼續,然後當你點擊關閉按鈕更新時,結束。在我看來,無限while循環是主要問題。一旦它結束,圖形用戶界面可以完成,這一切都可以實現。

+0

可能重複遐,這個錯誤讓我困惑很多。運行時一切正常,但最終會出現錯誤。但是如果我像你說的那樣添加「pai.mainloop()」,錯誤仍然會發生。 –

+1

pai.mainloop()不是爲了解決這個錯誤,而只是一個一般的建議。錯誤來自它在仍然運行時終止的事實。在我看來,這不是太大的錯誤。如果你想解決它,你可以試試看,除了塊。主循環與你能夠處理事件的程序有關。你的程序不會因缺少它而受到很大的影響,但它是一個很好的習慣。(我已經忘記了,並且很困惑我的事件沒有起作用) –

1

我相信你會得到這個錯誤,因爲你試圖訪問小部件,而沒有,類似於this question。當您使用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() 

使用下面的另一個例子Bryan的建議可能會產生。您可以需要在下面的例子中調整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() 
+0

使用'after(0,...)'是個不錯的主意。第一個參數應該至少爲1(否),否則你可能會阻止處理任何其他事件。另外,如果進行更改,則可以刪除對「update_idletasks()」的調用。 –

+0

@BryanOakley我試着用1,但是因爲它看起來比OP的動畫慢,所以放棄了。然後再一次可以用't'來調整我的想法。 – Nae

+0

我沒有運行它,但我會與@ Nae的第二個建議(與布萊恩奧克利的建議)。更優雅。除非你真的不在乎(因爲在應用程序關閉後錯誤並沒有影響任何事情,所以我只需要一天的時間就可以試試,除了;-) +1對於Nae –