我刚开始制作简单的python GUI。我正在这里工作,当我运行它时,矩形是静态的。是否有任何修复可以使矩形每秒水平移动50像素?我一直在努力修复它,但没有取得任何成功。
from tkinter import *
import time
rectMove = True
class rectMove():
def __init__(self):
root = Tk()
frame = Frame(root, width=500, height=500)
frame.grid()
canvas = Canvas(frame, width=500, height=500)
canvas.grid()
firstX = 50
firstY = 50
secondX = 100
secondY = 100
rectangle = canvas.create_rectangle(firstX, firstY, secondX, secondY, fill="Black")
while rectMove is True:
rectangle.destroy()
time.sleep(1)
firstX += 50
secondX += 50
rectangle = canvas.create_rectangle(firstX, firstY, secondX, secondY, fill="Black")
root.mainloop()
rectMove = rectMove()
答案 0 :(得分:0)
您的第一个问题是您有一个名为rectMove
的全局变量,并且您还有一个名为rectMove
的类。类定义隐藏了全局变量。这一行:while rectMove is True:
表示“循环,如果变量rectMove是布尔变量True”,这是假的,因为rectMove不是变量True,它是一个类。因此,你的循环根本不会执行。
你可能想要的更像while True:
,但这个简单的改变会暴露其他问题。
循环中的第一行rectangle.destroy()
引发异常。您可能想要的功能是canvas.delete(rectangle)
。修复此问题并运行程序后,您将看不到任何内容。那是因为while循环是无限的。你的程序将永远坐在那里。
Tk程序是事件驱动的。制作定时循环并不简单。您需要使用以下功能:
w.after(delay_ms, callback=None, *args)
Requests Tkinter to call function callback with arguments args after a delay of at least delay_ms milliseconds
这些文档来自http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/universal.html
您需要编写一个删除并重绘矩形的回调函数,而不是编写一个简单的while循环,然后再次调用w.after
来重复该过程。