2014-10-03 24 views
2

我有一个非常基本的Tkinter应用程序,我试图设置为自动刷新。我正在使用threading.Timer触发一个名为go的函数,在该函数结束时唤醒计时器以重置它以再次运行。Python Threading.Timer正在调用命令而不等待

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

我已经花了我大部分的下午试图解决这一点,但我似乎无法找出什么我做错了。基于我读过的其他问题,我明白每个实例都会为计时器创建一个单独的线程,但为什么不等待触发该函数之前经过的时间。

+0

如果你使用Tkinter的,使用一个线程来自动刷新,是解决问题的错误的方式。您可以通过调用root小部件(或任何小部件)的'after'方法来安排将来运行的函数,从而避免线程的复杂性。 – 2014-10-06 11:08:11

+0

@BryanOakley我会研究一下,谢谢! – Tbaker 2014-10-06 12:40:44

回答

4

用途:

t=threading.Timer(5,go) 

注意go而非go()。括号告诉Python调用函数。相反,go是一个函数对象。函数是Python中的“第一类”对象;它们可以像任何其他对象一样传递给函数。

Python在调用函数之前对函数的参数进行求值。因此在致电threading.Timer之前使用go()调用go。由go()返回的值被发送到Timer,这不是你想要的。


请注意,所有Tkinter UI代码应该从单个线程调用。出于这个原因,使用Tkinter的root.after方法可能是您想要做的更好的选择。 after方法安排将由Tkinter的mainloop调用的函数。下面是使用after一些例子:

+0

这非常合理!感谢您的帮助! – Tbaker 2014-10-06 12:42:44