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):
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)
wx.CallAfter(self.frame.Close)
+ def flush(self):
+ pass
+
+
#----------------------------------------------------------------------
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
not 'python', and only when you are logged in on the main display of
your Mac."""
_sys.exit(1)
+ except SystemExit:
+ raise
except:
pass
# 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
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 __del__(self, destroy=wx.PyApp.__del__):
+ self.RestoreStdio() # Just in case the MainLoop was overridden
+ destroy(self)
+ def Destroy(self):
+ wx.PyApp.Destroy(self)
+ self.thisown = 0
def SetTopWindow(self, frame):
"""Set the \"main\" top level window"""
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
+
: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