wxTimer problem

Morpheus morpheus at spam.no
Sat Sep 16 16:06:42 EDT 2006


On Fri, 15 Sep 2006 12:47:30 -0700, abcd wrote:

> I have a python script which creates a wx.App, which creates a wx.Frame
> (which has a wx.Timer).
> 
> looks sorta like this:
> 
> class MyProgram:
>     def __init__(self):
>         self.app = MyApp(0)
>         self.app.MainLoop()
> 
> class MyApp(wx.App):
>     def OnInit(self):
>         self.myframe= MyFrame()
>         self.myframe.Show(True)
>         self.SetTopWindow(self.myframe)
>         return True
> 
> class MyFrame(wx.Frame):
>     def __init__(self):
>        # do some other stuff here
> 
>        # setup the timer
>         self.timer = wx.Timer(self)
>         self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
>         self.timer.Start(100)
> 
>     def killTimer(self):
>         self.Unbind(wx.EVT_TIMER)
>         self.timer.Stop()
>         self.timer = None
> 
> 
> ....that's the jist of it.
> 
> Anyhow, so I startup python and import my script, which loads up the
> wx.App, frame and all.
> 
> foo = MyProgram()
> 
> 
> Then I close the frame.  when the frame is closed it calls killTimer.
> This method gets called and no exceptions occur.
> 
> Then...I create a new instance of the app and try to load the frame
> again.
> 
> foo = MyProgram()
> 
> ...and I am getting this error:
> 
> "timer can only be started from the main thread"
> 
> how can I fix this??
> 
> FYI, my script is being started by a new thread each time, so
> ultimately we have....
> 
> def startProgram():
>     foo = MyProgram()
> 
> threading.Thread(target=startProgram).start()
> 
> 
> Thanks in advance.

You must not access wx from more than one thread. Read their wiki about
this and about the appropriate workaround.

Morpheus





More information about the Python-list mailing list