。在无法正常运行后

时间:2019-06-21 13:04:14

标签: 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 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

2 个答案:

答案 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)