2016-01-23 67 views
0

我製作了一個正方形,並讓它移動,但當我退出時會出現錯誤。我究竟做錯了什麼?由於使用tkinter在畫布中移動矩形時出錯

這是我的代碼:

from tkinter import * 
import time 


root = Tk() 

canvas = Canvas(root, height=500, width=500) 
canvas.pack() 

a = canvas.create_rectangle(10, 10, 50, 50) 


for i in range(0, 60): 
    canvas.move(a,5,0) 
    root.update() 
    time.sleep(0.1) 


root.mainloop() 

這是我的錯誤:

Traceback (most recent call last): 
    File "C:\Users\Owner\Documents\Brad\Test.py", line 17, in <module> 
    canvas.move(a,5,0) 
    File "C:\Python34\lib\tkinter\__init__.py", line 2434, in move 
    self.tk.call((self._w, 'move') + args) 
_tkinter.TclError: invalid command name ".57748176" 
+0

使用'root.after'而不是'for'循環和'sleep' – furas

+0

您能否請解釋一下,我對此並不瞭解,並且不明白您的回答 – MAON

+0

這不是問題的答案。這只是對你的代碼的建議。 'mainloop'啓動程序並執行許多操作 - 處理事件,在屏幕上重新繪製小部件等,使用循環並休眠可以停止'mainloop'作業。 – furas

回答

1

有許多例子如何使用after反覆運行的東西。

afterfor循環和sleep更好的解決方案 - 它是tkinter的一部分。

after將時間和函數名稱添加到特殊列表中,mainloop將調用此函數。

from tkinter import * 

# --- functions --- 

def move_rectangle(): 

    # move rectangle 
    canvas.move(a,5,0) 

    # run `move_rectangle` again after 100ms (0.1s) 
    root.after(100, move_rectangle) # function name without() 

# --- main ---- 

root = Tk() 

canvas = Canvas(root, height=500, width=500) 
canvas.pack() 

a = canvas.create_rectangle(10, 10, 50, 50) 

# run `move_rectangle` first time after 100ms (0.1s) 
root.after(100, move_rectangle) # function name without() 
#move_rectangle() # or run first time immediately 

# "start the engine" 
root.mainloop() 

-

順便說一句:如果你需要運行長期運行的功能,那麼你就需要線程。

+0

謝謝!非常有用,但我不知道什麼線程,另一次 – MAON