. после того, как не работает, как я ожидал - PullRequest
1 голос
/ 21 июня 2019

Я использую .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 голосов
/ 21 июня 2019

Рассмотрите этот код:

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)
0 голосов
/ 21 июня 2019

.after не блокирует выполнение цикла. Это больше похоже на создание отдельного потока, который начинает выполнение через 500 (в вашем случае) миллисекунд. Другими словами, .after не блокирует цикл в течение 500 мс, вызывает 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» пять раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...