0

我有一个程序,每次 mainloop() 循环时我都需要移动一个图像对象。我没有尝试做太多,主要是因为我不知道从哪里开始。我制作了一个模拟我遇到的问题的项目的虚拟版本。

from tkinter import *

window = tk.Tk()
window.geometry('%ix%i+400+0' % (500, 600))

canvas = Canvas(window, width=500, height=600, bg='white')
canvas.pack()

w, x, y, z = 300, 300, 200, 200

x = canvas.create_rectangle(w, x, y, z)

def moveRectangle():
   canvas.move(x, 10, 0)

# Run the moveRectangle function everytime the mainloop loops
window.mainloop()

总结一下我的问题,我需要运行 mainloop,就好像它不是阻塞函数一样。相反,要么异步运行它,要么暂停它然后运行该函数,尽管我认为这是不可能的。

有什么帮助谢谢

4

2 回答 2

1

tkinter 中的 Mainloop 不会遍历您的代码。它循环遍历事件列表。您可以通过单击按钮等来创建事件。另一种方法是您可以调用类似update()或的命令update_idletasks()。结合它after()可以给你你正在寻找的结果。因此,请在文档中查找这些内容,这将很有帮助。您还可以阅读:了解 mainloop

def moveRectangle():
    canvas.move(x, 10, 0)
    for i in range(20):  # 20 moves 10px every 50ms
        window.after(50, canvas.move(x, 10, 0))
        window.update()
moveRectangle()

上面这段小代码演示了如何使用上述命令让对象在屏幕上移动。

于 2020-06-07T06:41:58.703 回答
0

我认为有一些方法可以设置一个自定义mainloop(),它可以在每次循环运行时更新你的 UI,但取决于你想要做什么,更常用的方法是在之后使用。通过安排 after 调用的函数用 after 调用自身,可以创建一个有效的循环。

我已经修改了您的代码,以在矩形到达画布两侧时反弹矩形,这样它就可以在无限期运行时显示一些东西。

import tkinter as tk

WAIT = 10 # in milliseconds, can be zero

window = tk.Tk()
window.geometry('%ix%i+400+0' % (500, 600))

canvas = tk.Canvas(window, width=500, height=600, bg='white')
canvas.pack()

w, x, y, z = 300, 300, 200, 200

x = canvas.create_rectangle(w, x, y, z)

amount = 10

def direction( current ):
    x0, y0, x1, y1 = canvas.bbox( x )
    if x0 <= 0:
        return 10   # Move rect right
    elif x1 >= 500:
        return -10  # Move rect left
    else:
        return current

def moveRectangle():
    global amount
    canvas.move(x, amount, 0)
    window.update()

    # Change Direction as the rectangle hits the edge of the canvas.
    amount = direction( amount )

    window.after( WAIT, moveRectangle )
    #              ms ,   function
    # Loop implemented by moveRectangle calling itself.

window.after( 1000, moveRectangle )
# Wait 1 second before starting to move the rectangle.

window.mainloop()
于 2020-06-08T19:48:57.017 回答