问题描述
我想让一个小方块每 3 秒向左移动 10 个像素,我的代码如下。我不确定为什么它只移动一次。一些帮助将不胜感激!
...
[11] 40678/tcp ALLOW IN Anywhere
[12] 5432/tcp ALLOW IN Anywhere
[13] 888/tcp (v6) ALLOW IN Anywhere (v6)
[14] 20/tcp (v6) ALLOW IN Anywhere (v6)
[15] 21/tcp (v6) ALLOW IN Anywhere (v6)
[16] 22/tcp (v6) ALLOW IN Anywhere (v6)
[17] 80/tcp (v6) ALLOW IN Anywhere (v6)
[18] 39000:40000/tcp (v6) ALLOW IN Anywhere (v6)
[19] 8888/tcp (v6) ALLOW IN Anywhere (v6)
[20] 8443/tcp (v6) ALLOW IN Anywhere (v6)
[21] 8443/udp (v6) ALLOW IN Anywhere (v6)
[22] 443/tcp (v6) ALLOW IN Anywhere (v6)
[23] 40678/tcp (v6) ALLOW IN Anywhere (v6)
[24] 5432/tcp (v6) ALLOW IN Anywhere (v6)
解决方法
mainloop()
运行循环,该循环在您关闭窗口之前一直有效 - 因此它会阻止所有循环并且仅执行一次并且仅移动矩形一次。在您的版本中,您应该删除 mainloop()
并且它不会阻止它 - 因为您在循环中使用 update()
所以它会正确运行。
但是你可以用不同的方式来做到这一点。
您可以在 3 秒后使用 root.after(3000,draw_rect)
执行 draw_rect()
。并且 draw_rect()
应该再次运行 root.after(3000,draw_rect)
以在 3 秒后再次运行它 - 这样它就会循环并且不会被 mainloop()
阻塞(mainloop()
将运行 {{1 }} 每 3 秒)
draw_rect()
具有函数 Canvas
,因此您不必删除矩形并重新创建它。
我使用 move(object,dx,dy)
使其运行得更快。
300ms
PEP 8 -- Style Guide for Python Code
编辑:
使用变量 import tkinter as tk
# --- constants --- (PEP8: UPPER_CASE_NAMES)
WIDTH = 400
HEIGHT = 400
# --- functions ---
def move_rect():
canvas.move(c1,-10,0) # move left
canvas.move(c2,10,0) # move right
# run again after 300ms
root.after(300,move_rect) # 300ms = 0.3s # I use smaller value to make it faster
# --- main ---
x1 = y1 = WIDTH / 2
root = tk.Tk()
canvas = tk.Canvas(root,width=WIDTH,height=HEIGHT)
canvas.pack()
c1 = canvas.create_rectangle(x1,y1,x1 + 10,y1 + 10,fill="green")
c2 = canvas.create_rectangle(x1,fill="red")
# run first time after 300ms
root.after(300,move_rect) # 300ms = 0.3s # I use smaller value to make it faster
root.mainloop()
,speed1
在矩形靠近边界时改变方向的版本。
speed2