【问题标题】:Error moving rectangle in canvas using tkinter使用 tkinter 在画布中移动矩形时出错
【发布时间】:2016-01-23 16:43:55
【问题描述】:

我制作了一个正方形并让它移动,但当我退出时它会带来错误。我究竟做错了什么?谢谢

这是我的代码:

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"

【问题讨论】:

  • 使用root.after而不是for循环和sleep
  • 你能解释一下吗,我是新手,不明白你的答案
  • 这不是问题的答案。这只是对您的代码的建议。 mainloop 启动程序并做很多事情 - 处理事件,在屏幕上重绘小部件等,使用循环和睡眠会停止 mainloop 工作。
  • 谢谢!我在窗口移动时退出了窗口,所以它带来了错误,但是当我让循环完成然后退出时,没有错误。无论如何,你有什么办法可以防止这种情况发生?
  • @NoamNeumann:最简单的方法是使用 try 块并捕获被抛出的 TclError

标签: python canvas tkinter


【解决方案1】:

有很多示例如何使用after 重复运行某事。

after 是比for 循环和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()

-

顺便说一句:如果您需要运行长时间运行的函数,那么您将需要线程。

【讨论】:

  • 谢谢!很有用,不过不知道是什么线程,下次再来
猜你喜欢
  • 1970-01-01
  • 2017-06-29
  • 2017-03-08
  • 2019-07-05
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2014-01-05
  • 2019-02-14
相关资源
最近更新 更多