关于Python画布移动对象

mzaanser  于 2022-11-26  发布在  Python
关注(0)|答案(1)|浏览(164)

我想以50的步长从左向右移动一个矩形,但是画布直到矩形到达右侧才绘制矩形。

import tkinter as tk
import time
root=tk.Tk()
c_width,c_height=500,250
cv = tk.Canvas(root,bg = 'white',width=c_width,height=c_height)

l_x=0
l_y=0
r_x=50
r_y=50
step=50
r1=cv.create_rectangle(l_x,l_y,r_x,r_y,fill='red')

while l_x<c_width-50:
   
   cv.delete(r1)
   l_x=l_x+step
   r_x=r_x+step   
   r1=cv.create_rectangle(l_x,l_y,r_x,r_y,fill='red')
   print(c_width,l_x)
   time.sleep(1)

cv.pack()
root.mainloop()
t40tm48m

t40tm48m1#

不建议在tkinter应用程序中使用while/for循环,因为它会阻止tkinter mainloop()处理挂起的事件和更新。请改用.after()
此外,您不需要删除和重新创建矩形项,只需使用cv.move()移动矩形项。
下面是更新代码:

import tkinter as tk

root = tk.Tk()

c_width, c_height = 500, 250
cv = tk.Canvas(root, bg='white', width=c_width, height=c_height)
cv.pack()

l_x = 0
l_y = 0
r_x = 50
r_y = 50
step = 50
r1 = cv.create_rectangle(l_x, l_y, r_x, r_y, fill='red')

def move_rect(x):
    # move the rectangle by "step" pixels horizontally
    cv.move(r1, step, 0)
    x += step
    if x < c_width:
        cv.after(1000, move_rect, x)

cv.after(1000, move_rect, r_x)
root.mainloop()

相关问题