X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dce2bd223c2370f001f9ca93e04cbd437ff3f988..f78e4942ec0f3f6abd2992502e2d6c5c2e8e55f6:/wxPython/src/_app_ex.py diff --git a/wxPython/src/_app_ex.py b/wxPython/src/_app_ex.py index 808743dd33..bae7df624e 100644 --- a/wxPython/src/_app_ex.py +++ b/wxPython/src/_app_ex.py @@ -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,12 +21,11 @@ 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) @@ -60,6 +61,10 @@ class PyOnDemandOutputWindow: wx.CallAfter(self.frame.Close) + def flush(self): + pass + + #---------------------------------------------------------------------- @@ -78,40 +83,45 @@ 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 @@ -128,6 +138,8 @@ 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 SystemExit: + raise except: pass @@ -140,11 +152,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,6 +165,9 @@ 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() @@ -190,6 +206,22 @@ your Mac.""" _sys.stdout, _sys.stderr = self.saveStdio + 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 + + + # change from wx.PyApp_XX to wx.App_XX App_GetMacSupportPCMenuShortcuts = _core_.PyApp_GetMacSupportPCMenuShortcuts @@ -220,14 +252,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