如何在python gui中制作一个矩形移动

时间:2018-01-22 02:01:32

标签: python tkinter

我刚开始制作简单的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()

1 个答案:

答案 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来重复该过程。