2016-01-23 60 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