2014-10-03 5 views
2

У меня есть очень базовое приложение Tkinter, которое я пытаюсь настроить для автоматического обновления. Я использую threading.Timer для запуска функции, называемой go, в конце которой коллирует таймер, чтобы перезапустить его для запуска снова.Python Threading.Timer вызывает команду без ожидания

def SetTimer(): 
    t=threading.Timer(5,go()) 
    t.start 
    SetTimer() 

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

+0

Если вы используете Tkinter, используя нить для автоматического обновления неправильный способ решить эту проблему. Вы можете избежать сложностей потоков, вызвав метод 'after' корневого виджета (или любого виджета), чтобы запланировать выполнение функции в будущем. –

+0

@BryanOakley Я посмотрю, что спасибо! – Tbaker

ответ

4

Использование:

t=threading.Timer(5,go) 

Обратите внимание на go, а не go(). Скобки указывают Python на вызов функции. Напротив, go является функциональным объектом. Функции - это «первоклассные» объекты в Python; они могут передаваться функциям, как и любой другой объект.

Python оценивает аргументы функции перед вызовом функции. Поэтому, используя go(), звоните go перед вызовом threading.Timer. Значение, возвращаемое go(), отправляется на адрес Timer, что не так.


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

+0

Это имеет смысл! Спасибо за помощь! – Tbaker

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