Python .在没有像我预期的那样发挥作用之后
我正在使用.after调用一个函数,该函数在我的GUI中移动图像。当我运行代码并调用函数“myFunc”时,图像确实会移动,但它是瞬间发生的。它应该逐渐在屏幕上移动。我不确定为什么会发生这种情况Python .在没有像我预期的那样发挥作用之后,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在使用.after调用一个函数,该函数在我的GUI中移动图像。当我运行代码并调用函数“myFunc”时,图像确实会移动,但它是瞬间发生的。它应该逐渐在屏幕上移动。我不确定为什么会发生这种情况 def movRight(): global img global imgx canvas.move(imgx,20,0) return def myFunc(): moveController(1,20) return def moveControl
def movRight():
global img
global imgx
canvas.move(imgx,20,0)
return
def myFunc():
moveController(1,20)
return
def moveController(extruder, position):
global e1current
global e2current
global e3current
global e4current
if extruder == 1:
while position > e1current:
print("moving")
e1current+=1
main.after(500,movRight)
return
.after不会阻止循环的执行。它更像是产生了一个单独的线程,在500(在您的情况下)毫秒后开始执行。换句话说,之后不阻塞循环500ms,调用movRight,然后继续循环。看看这个例子:
import tkinter as tk
def print_hi():
print("hi")
root = tk.Tk()
for i in range(5):
root.after(1000, print_hi)
print("loop done")
root.mainloop()
这将输出“循环完成”,然后,大约一秒钟后,它将打印“hi”五次。.after不会阻止循环的执行。它更像是产生了一个单独的线程,在500(在您的情况下)毫秒后开始执行。换句话说,之后不阻塞循环500ms,调用movRight,然后继续循环。看看这个例子:
import tkinter as tk
def print_hi():
print("hi")
root = tk.Tk()
for i in range(5):
root.after(1000, print_hi)
print("loop done")
root.mainloop()
这将输出“loop done”(循环完成),大约一秒钟后,它将打印“hi”(高)五次。考虑以下代码:
while position > e1current:
main.after(500,movRight)
这与您这样写的情况相同:
main.after(500,movRight)
main.after(500,movRight)
main.after(500,movRight)
...
由于调用main.after(500,movRight)
可能在一毫秒左右的时间内执行,因此您正在排队等待数百或数千个调用,这些调用将在未来500毫秒内全部执行
换句话说,如果你这样做了,也没有什么不同:
def something():
movRight()
movRight()
movRight()
...
main.after(500,something)
制作动画的正确方法是创建一个可以制作一帧动画的函数,然后重新安排自己的时间
例如:
def moveController():
movRight()
e1current+=1
if position > e1current:
main.after(500, moveController)
考虑以下代码:
while position > e1current:
main.after(500,movRight)
这与您这样写的情况相同:
main.after(500,movRight)
main.after(500,movRight)
main.after(500,movRight)
...
由于调用main.after(500,movRight)
可能在一毫秒左右的时间内执行,因此您正在排队等待数百或数千个调用,这些调用将在未来500毫秒内全部执行
换句话说,如果你这样做了,也没有什么不同:
def something():
movRight()
movRight()
movRight()
...
main.after(500,something)
制作动画的正确方法是创建一个可以制作一帧动画的函数,然后重新安排自己的时间
例如:
def moveController():
movRight()
e1current+=1
if position > e1current:
main.after(500, moveController)
您正在同时调度
movRight()
(position-e1current
)的所有实例;所有这些都是在500毫秒后快速连续发生的。您需要做的是调用movRight()
一次,如果未到达最终位置,则让它安排对自身的另一次调用。您正在同时安排movRight()
(position-e1current
)的所有实例;所有这些都是在500毫秒后快速连续发生的。您需要做的是调用movRight()
一次,如果未到达最终位置,则让它安排另一次调用。