]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/src/_app_ex.py
GetSpacer returns a copy, not a reference to the size
[wxWidgets.git] / wxPython / src / _app_ex.py
index 808743dd33f5421fe6f107ee09f9be6d2b57150b..f6f7a5ac3e657b61940a05a108d4fadaee24021f 100644 (file)
@@ -11,6 +11,8 @@ class PyOnDemandOutputWindow:
     def __init__(self, title = "wxPython: stdout/stderr"):
         self.frame  = None
         self.title  = title
+        self.pos    = wx.DefaultPosition
+        self.size   = (450, 300)
         self.parent = None
 
     def SetParent(self, parent):
@@ -19,14 +21,13 @@ class PyOnDemandOutputWindow:
 
 
     def CreateOutputWindow(self, st):
-        self.frame = wx.Frame(self.parent, -1, self.title,
-                              style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
+        self.frame = wx.Frame(self.parent, -1, self.title, self.pos, self.size,
+                              style=wx.DEFAULT_FRAME_STYLE)
         self.text  = wx.TextCtrl(self.frame, -1, "",
-                                 style = wx.TE_MULTILINE | wx.TE_READONLY)
+                                 style=wx.TE_MULTILINE|wx.TE_READONLY)
         self.text.AppendText(st)
-        self.frame.SetSize((450, 300))
         self.frame.Show(True)
-        EVT_CLOSE(self.frame, self.OnCloseWindow)
+        self.frame.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
         
 
     def OnCloseWindow(self, event):
@@ -60,11 +61,15 @@ class PyOnDemandOutputWindow:
             wx.CallAfter(self.frame.Close)
 
 
+    def flush(self):
+        pass
+    
+
 
 #----------------------------------------------------------------------
 
 _defRedirect = (wx.Platform == '__WXMSW__' or wx.Platform == '__WXMAC__')
-
+        
 class App(wx.PyApp):
     """
     The ``wx.App`` class represents the application and is used to:
@@ -78,59 +83,70 @@ class App(wx.PyApp):
 
     Every application must have a ``wx.App`` instance, and all
     creation of UI objects should be delayed until after the
-    ``wx.App`` object has been created in order to ensure that the
-    gui platform and wxWidgets have been fully initialized.
+    ``wx.App`` object has been created in order to ensure that the gui
+    platform and wxWidgets have been fully initialized.
 
     Normally you would derive from this class and implement an
     ``OnInit`` method that creates a frame and then calls
     ``self.SetTopWindow(frame)``.
 
-    :see: `wx.PySimpleApp` for a simpler app class that can be used directly.
+    :see: `wx.PySimpleApp` for a simpler app class that can be used
+           directly.
     """
     
     outputWindowClass = PyOnDemandOutputWindow
 
-    def __init__(self, redirect=_defRedirect, filename=None, useBestVisual=False):
+    def __init__(self, redirect=_defRedirect, filename=None,
+                 useBestVisual=False, clearSigInt=True):
         """
         Construct a ``wx.App`` object.  
 
-        :param redirect: Should ``sys.stdout`` and ``sys.stderr``
-            be redirected?  Defaults to True on Windows and Mac,
-            False otherwise.  If `filename` is None then output
-            will be redirected to a window that pops up as
-            needed.  (You can control what kind of window is
-            created for the output by resetting the class
-            variable ``outputWindowClass`` to a class of your
-            choosing.)
+        :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
+            redirected?  Defaults to True on Windows and Mac, False
+            otherwise.  If `filename` is None then output will be
+            redirected to a window that pops up as needed.  (You can
+            control what kind of window is created for the output by
+            resetting the class variable ``outputWindowClass`` to a
+            class of your choosing.)
 
-        :param filename: The name of a file to redirect output
-            to, if redirect is True.
+        :param filename: The name of a file to redirect output to, if
+            redirect is True.
 
         :param useBestVisual: Should the app try to use the best
-            available visual provided by the system (only
-            relevant on systems that have more than one visual.)
-            This parameter must be used instead of calling
-            `SetUseBestVisual` later on because it must be set
-            before the underlying GUI toolkit is initialized.
+            available visual provided by the system (only relevant on
+            systems that have more than one visual.)  This parameter
+            must be used instead of calling `SetUseBestVisual` later
+            on because it must be set before the underlying GUI
+            toolkit is initialized.
+
+        :param clearSigInt: Should SIGINT be cleared?  This allows the
+            app to terminate upon a Ctrl-C in the console like other
+            GUI apps will.
 
         :note: You should override OnInit to do applicaition
             initialization to ensure that the system, toolkit and
             wxWidgets are fully initialized.
         """
+        
         wx.PyApp.__init__(self)
 
-        if wx.Platform == "__WXMAC__":
-            try:
-                import MacOS
-                if not MacOS.WMAvailable():
-                    print """\
-This program needs access to the screen. Please run with 'pythonw',
-not 'python', and only when you are logged in on the main display of
-your Mac."""
-                    _sys.exit(1)
-            except:
-                pass
+        # make sure we can create a GUI
+        if not self.IsDisplayAvailable():
+            
+            if wx.Platform == "__WXMAC__":
+                msg = """This program needs access to the screen.
+Please run with 'pythonw', not 'python', and only when you are logged
+in on the main display of your Mac."""
+                
+            elif wx.Platform == "__WXGTK__":
+                msg ="Unable to access the X Display, is $DISPLAY set properly?"
 
+            else:
+                msg = "Unable to create GUI"
+                # TODO: more description is needed for wxMSW...
+
+            raise SystemExit(msg)
+        
         # This has to be done before OnInit
         self.SetUseBestVisual(useBestVisual)
 
@@ -140,11 +156,12 @@ your Mac."""
         # KeyboardInterrupt???)  but will later segfault on exit.  By
         # setting the default handler then the app will exit, as
         # expected (depending on platform.)
-        try:
-            import signal
-            signal.signal(signal.SIGINT, signal.SIG_DFL)
-        except:
-            pass
+        if clearSigInt:
+            try:
+                import signal
+                signal.signal(signal.SIGINT, signal.SIG_DFL)
+            except:
+                pass
 
         # Save and redirect the stdio to a window?
         self.stdioWin = None
@@ -152,17 +169,30 @@ your Mac."""
         if redirect:
             self.RedirectStdio(filename)
 
+        # Use Python's install prefix as the default  
+        wx.StandardPaths.Get().SetInstallPrefix(_sys.prefix)
+
         # This finishes the initialization of wxWindows and then calls
         # the OnInit that should be present in the derived class
         self._BootstrapApp()
 
 
-    def __del__(self):
-        try:
-            self.RestoreStdio()  # Just in case the MainLoop was overridden
-        except:
-            pass
+    def OnPreInit(self):
+        """
+        Things that must be done after _BootstrapApp has done its
+        thing, but would be nice if they were already done by the time
+        that OnInit is called.
+        """
+        wx.StockGDI._initStockObjects()
+        
+
+    def __del__(self, destroy=wx.PyApp.__del__):
+        self.RestoreStdio()  # Just in case the MainLoop was overridden
+        destroy(self)
 
+    def Destroy(self):
+        self.this.own(False)
+        wx.PyApp.Destroy(self)
 
     def SetTopWindow(self, frame):
         """Set the \"main\" top level window"""
@@ -187,7 +217,26 @@ your Mac."""
 
 
     def RestoreStdio(self):
-        _sys.stdout, _sys.stderr = self.saveStdio
+        try:
+            _sys.stdout, _sys.stderr = self.saveStdio
+        except:
+            pass
+
+
+    def SetOutputWindowAttributes(self, title=None, pos=None, size=None):
+        """
+        Set the title, position and/or size of the output window if
+        the stdio has been redirected.  This should be called before
+        any output would cause the output window to be created.
+        """
+        if self.stdioWin:
+            if title is not None:
+                self.stdioWin.title = title
+            if pos is not None:
+                self.stdioWin.pos = pos
+            if size is not None:
+                self.stdioWin.size = size
+            
 
 
 
@@ -220,14 +269,14 @@ class PySimpleApp(wx.App):
     :see: `wx.App` 
     """
 
-    def __init__(self, redirect=False, filename=None, useBestVisual=False):
+    def __init__(self, redirect=False, filename=None,
+                 useBestVisual=False, clearSigInt=True):
         """
         :see: `wx.App.__init__`
         """
-        wx.App.__init__(self, redirect, filename, useBestVisual)
+        wx.App.__init__(self, redirect, filename, useBestVisual, clearSigInt)
         
     def OnInit(self):
-        wx.InitAllImageHandlers()
         return True