如何在wx.App MainLoop中添加一个更新Window对象的定时器?

问题描述:

有没有办法将定时器或钩子放到MainLoop中,以每1秒钟的速度调用某些wx窗口中的某些方法?如何在wx.App MainLoop中添加一个更新Window对象的定时器?

我可以把定时器放在一个wx.Frame对象中,但我想把一个定时器以外的那些对象放在之外。有没有办法做到这一点?

如果我启动一个线程,并尝试这样做,我得到:

self.updateThread = Thread(target = updateWindows, args=[self]) 
self.updateThread.start()   
app.MainLoop() 


Pango:ERROR:/build/pango1.0-EzEh0I/pango1.0-1.38.1/./pango/pango-layout.c:3925:pango_layout_check_lines: assertion failed: (!layout->log_attrs) 
Aborted (core dumped) 

并添加updateThread.join()

self.updateThread = Thread(target = updateWindows, args=[self]) 
self.updateThread.start() 
self.updateThread.join() 

app.MainLoop() 

没有被绘制在屏幕上。

更新:澄清,在Python中一个计时器是一个线程,所以我会使用哪个更适合任务(计时器或线程)。我想每N秒更新N个Window对象。

wx小部件有它自己的计时器,但它们应该绑定到Window对象,所以我需要N个wx.widgets计时器用于N Window对象,这不是我想要的。

+0

为什么你需要一个线程?你可以没有它吗? – Igor

+0

真的不清楚你在问什么:你想使用定时器或线程还是两者兼而有之?你对定时器有什么确切的问题(提示:它们不在任何内部或外部)? –

+0

我会更新说明。基本上我想每隔X秒更新一次窗口。 Timer是Python中的一个线程,所以对于任务来说哪个更好。 – hhaamm

一个简单的解决方案,避免了使用定时器和创建你自己的线程是使用wx.CallLater

def poll(self): 
    do_something() 
    # waits 1 seconds before calling again 
    wx.CallLater(1000, self.poll)