gpt4 book ai didi

python - 在 tkinter 中使用 after 方法

转载 作者:行者123 更新时间:2023-12-01 02:08:09 28 4
gpt4 key购买 nike

按照建议,我开始使用 .after 方法创建弹跳球 GUI,但又遇到了问题。

from tkinter import*
from tkinter import ttk
import random


class Widg:
def __init__(self, master):
master.geometry('600x500+200+150')
canvas = Canvas(master)
canvas.pack(fill=BOTH, expand=True)
oval = canvas.create_oval(1, 1, 11, 11, fill='green')

def call_func(self):
for i in range(3):
rand_x = random.randint(1, 50)
rand_y = random.randint(1, 50)
canvas.move(oval, rand_x, rand_y)
canvas.after(500)
print('x= ', rand_x)
print('y= ', rand_y)

canvas.bind('<ButtonPress-1>', call_func)


def main():

root = Tk()

a = Widg(root)

root.mainloop()


if __name__ == '__main__':
main()

再次,当我启动它时,它在小部件后面运行并仅显示最终结果。 (无动画)

更新:upd2.:@tobias_k 适当注意!不会再发生了!感谢您的回答!

最佳答案

您必须指定要在 after 中调用的函数 - 在您的情况下,与调用它的函数相同。如前所述 in comments ,如果没有回调函数,after 的行为就像 sleep (除了参数以毫秒而不是秒为单位),即它将等待给定的时间,但是这样做将阻塞 UI,从而不会注册任何输入,特别是在循环结束之前不会重新绘制球。通过使用回调调用 after,您可以无限期地再次调用该函数,每次都重新定位并重新绘制球。

另外,请注意 call_func 的参数不是 self(与原始代码中一样)——它不是类的方法,而是一个嵌套函数——而是由鼠标单击发出的事件。您应该将其设为默认参数,因为使用 after 时不会发生任何事件(并且您也不需要它)。另外,似乎没有必要循环;如果你想让球移动得更快,请减少 after 中的时间,并且使用 self 作为 rand_x/y 变量是没有意义的.

def call_func(event=None):
rand_x = random.randint(-50, 50)
rand_y = random.randint(-50, 50)
self.canvas.move(self.oval, rand_x, rand_y)
self.canvas.after(150, <b>call_func</b>)

如果您希望函数仅被回调有限次数,您可以添加另一个参数,以跟踪重复次数:

def call_func(event=None, <b>repeat=10</b>):
rand_x = random.randint(-50, 50)
rand_y = random.randint(-50, 50)
self.canvas.move(self.oval, rand_x, rand_y)
<b>if repeat:</b>
self.canvas.after(150, lambda: call_func(<b>repeat=repeat-1</b>))

关于python - 在 tkinter 中使用 after 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48863227/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com