]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/demo/viewer.py
merged 2.2 branch
[wxWidgets.git] / wxPython / demo / viewer.py
diff --git a/wxPython/demo/viewer.py b/wxPython/demo/viewer.py
new file mode 100644 (file)
index 0000000..ad438e1
--- /dev/null
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+"""
+    Run wxPython in a second thread.
+
+    Overview:
+        Importing this module creates a second thread and starts
+        wxPython in that thread.  Its single method,
+        add_cone(), sends an event to the second thread
+        telling it to create a VTK viewer window with a cone in
+        it.
+
+        This module is meant to be imported into the standard
+        Python interpreter.  It also works with Pythonwin.
+        It doesn't seem to work with IDLE (on NT anyways).
+        It should also work in a wxPython application.
+
+        Applications already running a wxPython app do not
+        need to start a second thread.  In these cases,
+        viewer creates the cone windows in the current
+        thread.  You can test this by running shell.py
+        that comes with wxPython, importing viewer and
+        calling add_cone.
+
+    Usage:
+        [user]$ python
+        Python 1.5.2 (#1, Sep 17 1999, 20:15:36)  ...
+        Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
+        >>> import viewer
+        >>> viewer.add_cone() # pop up a cone window
+        >>> a = 1
+        1
+        >>> viewer.add_cone() # create another cone window
+
+    Why would anyone do this?:
+        When using wxPython, the call to app.Mainloop() takes over
+        the thread from which it is called.  This presents a
+        problem for applications that want to use the standard
+        Python command line user interface, while occasionaly
+        creating a GUI window for viewing an image, plot, etc.
+        One soultion is to mangage the GUI in a second thread.
+
+        wxPython does not behave well if windows are created in
+        a thread other than the one where wxPython was originally
+        imported. ( I assume importing wxPython initializes some
+        info in the thread).  The current solution is to make the
+        original import of wxPython in the second thread and then
+        create all windows in that second thread.
+
+        Methods in the main thread can create a new window by issuing
+        events to a "catcher" window in the second thread.  This
+        catcher window has event handlers that actually create the
+        new window.
+"""
+
+class viewer_thread:
+    def start(self):
+        """ start the GUI thread
+        """
+        import thread,time
+        thread.start_new_thread(self.run, ())
+
+    def run(self):
+        """
+            Note that viewer_basices is first imported ***here***.
+            This is the second thread.  viewer_basics imports
+            wxPython.  if we imported it at
+            the module level instead of in this function,
+            the import would occur in the main thread and
+            wxPython wouldn't run correctly in the second thread.
+        """
+        from viewer_basics import *
+        try:
+            self.app = SecondThreadApp(0)
+            self.app.MainLoop()
+        except TypeError:
+            self.app = None
+
+    def add_cone(self):
+        """
+            send an event to the catcher window in the
+            other thread and tell it to create a cone window.
+        """
+        import viewer_basics
+        if self.app:
+            evt = viewer_basics.AddCone()
+            viewer_basics.wxPostEvent(self.app.catcher, evt)
+        else:
+            viewer_basics.add_cone()
+
+viewer = viewer_thread()
+viewer.start()
+
+def add_cone():
+    viewer.add_cone()
+
+