我正在使用.after来调用一个在GUI中移动图像的函数。当我运行代码并调用函数“ myFunc”时,图像确实会移动,但会立即发生。它应该逐渐在屏幕上移动。我不确定为什么会这样。
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
答案 0 :(得分:0)
.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”五次。
答案 1 :(得分:0)
考虑以下代码:
while position > e1current:
main.after(500,movRight)
这与您以这种方式编写的内容相同:
main.after(500,movRight)
main.after(500,movRight)
main.after(500,movRight)
...
由于调用main.after(500,movRight)
可能在毫秒左右执行,因此您正在排队的成百上千个调用将在未来500ms内全部执行。
换句话说,这与您执行此操作没有什么不同>
def something():
movRight()
movRight()
movRight()
...
main.after(500,something)
制作动画的正确方法是创建一个执行一帧动画的函数,然后重新安排自身的时间。
例如:
def moveController():
movRight()
e1current+=1
if position > e1current:
main.after(500, moveController)