如何解决试图找到一种方法来延迟Tkinter画布中循环的重复周期
基本上,我想做的是在屏幕上移动一个球,但是就像每隔几毫秒进行一次小移动,但是tkinter进行循环,将所有毫秒相加并将球移动到应该的位置(即,for循环中有250ms的延迟,以4为增量,球在1秒钟后移动)
示例代码:
import tkinter *
root = Tk()
global x
global y
w = 200
h = 200
x = w/2
y = h/2
pic = Canvas(root,width=w,height=h)
pic.pack()
mover = pic.create_oval(x,y,x+10,y+10,fill="red")
def left(event):
global x
for num in range(4):
x = -5
y = 0
pic.move(mover,x,y)
root.after(250)
root.bind("<Left>",left)
应该发生的是每250ms间隔进行4次运动,但是在一秒钟后发生一次大运动。
time.sleep()也会导致相同的错误,全球化y也没有作用(如预期的那样)
我找不到另一个已经回答的问题,因此请多多帮助,谢谢!
解决方法
所有GUI都可以更流畅地工作,它们不会在您更改项目时而是在结束功能后直接更新/重新绘制窗口。这样,它只需更新一次窗口(当您在功能上进行了许多更改时),并且工作更流畅(减少了斑点)。
如果您想使用after()
重复移动,则需要after(250,left)
,但不需要for
循环
after()
将向250,left
发送信息mainloop()
并将在250ms之后执行left()
-稍后您结束功能,因此mainloop()
可能会在更新窗口后一招。
最小工作代码
import tkinter as tk # PEP8: `import *` is not preferred
# --- functions ---
def left(event):
move(-5,4)
def right(event):
move(5,4)
def up(event):
move(0,-5,4)
def down(event):
move(0,5,4)
def move(dx,dy,n):
pic.move(mover,dx,dy)
n -= 1
if n > 0:
# repeate it again after 50ms
root.after(50,move,n)
# end of function so it goes back to mainloop and it can update/redraw window
# --- main ---
w = 200
h = 200
x = w/2
y = h/2
root = tk.Tk()
pic = tk.Canvas(root,width=w,height=h) # PEP8: spaces after `,`
pic.pack()
mover = pic.create_oval(x,y,x+10,y+10,fill="red") # PEP8: spaces after `,`
root.bind("<Left>",left) # PEP8: spaces after `,`
root.bind("<Right>",right)
root.bind("<Up>",up)
root.bind("<Down>",down)
root.mainloop()
如果您使用after(250)
或time.sleep(0.25)
进行睡眠,则需要root.update()
强制mainloop()
来更新/重绘窗口。
最小工作代码
import tkinter as tk # PEP8: `import *` is not preferred
# --- functions ---
def left(event):
move(-5,n):
for _ in range(n):
pic.move(mover,dy)
root.update() # <-- force `mainloop()` to update window
root.after(50)
#time.sleep(0.25)
# --- main ---
w = 200
h = 200
x = w/2
y = h/2
root = tk.Tk()
pic = tk.Canvas(root,down)
root.mainloop()
顺便说一句:这两个版本都有一个问题-当您按下多个键时,它将同时对所有键运行移动,因此它可能以奇怪的方式移动。它需要变量is_moving = True/False
来控制它是否可以移动其他键。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。