Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python .在没有像我预期的那样发挥作用之后_Python_Python 3.x_Tkinter - Fatal编程技术网

Python .在没有像我预期的那样发挥作用之后

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

我正在使用.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

.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()
一次,如果未到达最终位置,则让它安排另一次调用。