wxPython issues

Josiah Carlson jcarlson at nospam.uci.edu
Mon Feb 2 01:10:37 CET 2004


>     #wxpython: do not use this
>     ????#wxYield()
>     #//wait for GUI to end with owerwrite dialog

wxYield only makes sense when called from the main thread.  The main 
thread should be the only thread that is handling GUI events.


What I would do is:
     def OnOverwriteDlg(self, event):
         print "OnOverwriteDlg"
         dlg = COverwriteDlg ()
         dlg.m_strInfo = g_strTitle
         g_nGuiResult = dlg.ShowModal()
         print g_nGuiResult
         return g_nGuiResult

Toss the semaphores, toss the worker threads, etc.  If saving takes so 
much time, then you can do what I describe farther down.


> How can I get, that in worker thread on "before" is waiting, until the
> dialog in mainthread is finished?

Why are you trying to use multiple threads to save files?


> wxYield, Semaphore, Mutex, ... is all a bit strange for me.
> Is there any website dedicated to this issues?

wxYield is normally used when programming a single-threaded application. 
  If your application can spend a long time on one task without 
returning, and you want to allow the GUI to update while it is 
processing, calling wxYield() is a good idea.

For example, you can have a status bar that reflects a percent complete, 
without requiring a second thread to do the processing.

     def LongRunningMethod(self, event):
         for i in xrange(101):
             self.SetStatusText("%s%% complete"%i)
             wxYield()
             time.sleep(.1)


wxMutex and wxSemaphore are really just ways of only allowing one thread 
(or some certain count) to modify some structure at one time.

def updateglobal_m(count, wxmutex):
     global counter
     for i in xrange(count):
         wxmutex.Lock()
         counter += 1
         wxmutex.Unlock()

def updateglobal_s(count, wxsemaphore):
     global counter
     for i in xrange(count):
         wxsemaphore.Wait()
         counter += 1
         wxsemaphore.Post()

The standard Python Semaphore and Mutex calls are very similar...

def updateglobal_pys(count, pysemaphore):
     global counter
     for i in xrange(count):
         pysemaphore.acquire()
         counter += 1
         pysemaphore.release()

But a Python mutex has a few different options that you can read about 
in the standard documentation.


> 2. I want to get a list icons from the windows shell folders and put
> it in the wxPython List control. How can I accomplish this?

I don't know how to get arbitrary icons from executables or dlls. 
Perhaps someone else can tell us.


> 3. 
>   menuAdd(self, pMenuFile, _("Exit") +"\tAlt+F4", _("Exit"),
> self.OnClose, wxID_CLOSE)

Change the above to:
menuAdd(self, pMenuFile, _("Exit") +"\tAlt+F4", _("Exit"), self.OnClose, 
wxNewId())

Then in the __init__ method use:
EVT_CLOSE(self, self.OnClose)



  - Josiah



More information about the Python-list mailing list