2017-02-20 2 views
0

У меня есть функция contMove(), которая непрерывно перемещает объект через окно tkinter, когда я нажимаю кнопку. Однако, если я нажимаю кнопку, которая запускает эту функцию более одного раза, она ускоряется, так как первая подпрограмма не закрыта, потому что я хочу, чтобы она запускалась непрерывно, и они пробегают верхнюю часть eachother, ускоряя движение. Я не хочу, чтобы он ускорялся, поэтому я хочу поставить чек, который проверяет, изменяется ли координата X или Y, больше, чем скорость, в которой я хочу, и если да, подпрограмма. Кажется, это было бы обычным делом, но все, что я могу найти о модуле времени, - это время или время, или использование time.sleep, но я не могу использовать это, потому что я не могу остановить движение. Извините, если я испортил форматирование моего кода, когда я положил его здесьКак сказать, если x> x + y после z секунд :?

def contMove(moving): 
    global a 
    global b 
    global X, Y 
    if moving: 
     a = a + X 
     b = b + Y 
     mover.place(x = a, y = b) 
     a, b, X, Y = edgeBounce(a, b, X, Y) 
     mover.place(x = a, y = b) 
     #would be here 
     mover.after(17, lambda: contMove(moving)) 
    else: 
     return 
+0

Измените свой призыв к 'after', чтобы посмотреть, как это и увидеть, если это помогает: 'mover.after (17, contMove, move)'. –

+0

Я в замешательстве, не могли бы вы вставить это? Я не знаю, что или где вы имеете в виду – Feesih0ps

+0

удалите 'mover.after (17, лямбда: contMove (перемещение))' и замените его на 'mover.after (17, contMove, move)'. –

ответ

0

Вам нужно изменить, как вы используете after. То, как вы в настоящее время используете его, команда after будет искать значение moving только тогда, когда команда after действительно выполняет команду. Поэтому, если значение изменяется между временем, которое вы вызываете after, и время, которое вызывает функцию after, вы получите самую последнюю версию.

Вы хотите вместо этого указать значение after, так что ему не нужно искать значение во время выполнения этой функции. К счастью, after позволяет снабжать позиционные аргументы, которые передаются вместе с функцией.

Чтобы исправить код, удалите эту строку:

mover.after(17, lambda: contMove(moving)) 

... и заменить его на этой линии:

mover.after(17, contMove, moving) 
+0

То, что вы мне сказали, ничего не изменило. В конце концов, я понял, что мне просто нужно использовать .after_cancel в начале моей подпрограммы. – Feesih0ps

Смежные вопросы