[Twisted-Python] Excel, Twisted, and wxPython
Uwe C. Schroeder
uwe at oss4u.com
Sun Jun 1 04:57:06 EDT 2003
Well, I have no idea if you can get this working, but here are my $0.02
The problem with twisted and wx is that both systems are event driven and both
have a never-ending mainloop to process those events.
As you figured out already, wx is particularly weird with event loops. The wx
MainLoop processes only non-modal UI events. The moment you open a modal
window (or a pulldown menu) the mainloop stops looping and waits for some
"sub-loop" to terminate. Unfortunately this sub-loop depends on the platform
you are on. AFAIK wxWindows simply uses the loops from the different toolkits
(GTK, MS ....), so there is basically no way to hook into those loops in a
platform independant way. Maybe Robin can shed some light on this.
This is also the problem with the twisted wx support code. It works nicely as
long as you don't use a modal window. Then the code simply stops working.
That's why I posted a recipe on activestate's python cookbook, which uses a
timer to run the twisted reactor without actually running the reactor loop.
This is the only way I could get it working without using threads and as I
see in your Python2 file you figured that one out.
I am not sure what the wxApp Mainloop does internally. Maybe you try calling
the Dispatch and ProcessIdle methods once in a while, or dig into the source
and figure out what they do internally. My guess would be that some UI events
aren't processed properly.
Another wild idea that just jumped to my mind. Try an event.Skip() at the end
of you OnIdle handler. Maybe there is some other internal idle event handler
that never gets called since you have your own and thus you miss some
Not much, but maybe it helps.
On Sunday 01 June 2003 12:23 am, Andrew Dalke wrote:
> I'm working on an add-in for Excel, under MS Windows. This takes
> from the current selection and uses XML-RPC to call a remote server.
> The call may take a while, so I want to have a "Cancel" button. I
> decided to use wxPython for the GUI, with a modal dialog. Basically,
> a wxGauge (for the progress bar) and a "Cancel" button.
> The RPC call itself may take several minutes, so I need to use either
> threads or Twisted, and obviously I decided on the latter. (This is an
> in-process add-in; I'm worried about using threads inside the Excel
> process itself.)
> I can't figure out how to make this all work together. There's some
> support code in Twisted for wxPython, but it appears to only support
> the main event loop, while I'm running a modal window, and never call
> my wxApp's MainLoop.
> I tried replacing my wxDialog with a wxFrame, which kinda works,
> that the background is very strange. It looks like it hasn't been
> fully initialized.
> I've attached my code, in the hopes that someone here can help me
> figure out what to do.
> BTW, Twisted's wxPython support subsumes wx's main loop code. Is
> there any reason there can't be an implementation which hooks into
> wx's idle loop, so that users can decide who's in charge? I think that
> would actually fix my problem, since Modals (I think) process the
> idle loop ... Nope, I'm not clever enough to figure that out - my
> attempt is attached as "Progress2.py"
> dalke at dalkescientific.com
Open Source Solutions 4U, LLC 2570 Fleetwood Drive
Phone: +1 650 872 2425 San Bruno, CA 94066
Cell: +1 650 302 2405 United States
Fax: +1 650 872 2417
More information about the Twisted-Python