-from wxPython.wx import *
-from wxPython.lib.infoframe import *
+import sys
+
+import wx
+import wx.lib.infoframe
#----------------------------------------------------------------------
-class MyFrame(wxFrame):
- def __init__(self,output):
- wxFrame.__init__(self,None,-1,"Close me...",size=(300,100))
- menubar = wxMenuBar()
- menu = wxMenu()
- mID = NewId()
- menu.Append(mID,"&Enable output","Display output frame")
- EVT_MENU(self,mID,output.EnableOutput)
- mID = NewId()
- menu.Append(mID,"&Disable output","Close output frame")
- EVT_MENU(self,mID,output.DisableOutput)
- menubar.Append(menu,"&Output")
+class MyFrame(wx.Frame):
+ def __init__(self, output):
+ wx.Frame.__init__(self, None, -1, "Close me...", size=(300,100))
+
+ menubar = wx.MenuBar()
+
+ # Output menu
+ menu = wx.Menu()
+
+ # Enable output menu item
+ mID = wx.NewId()
+ menu.Append(mID, "&Enable output", "Display output frame")
+ self.Bind(wx.EVT_MENU, output.EnableOutput, id=mID)
+
+ # Disable output menu item
+ mID = wx.NewId()
+ menu.Append(mID, "&Disable output", "Close output frame")
+ self.Bind(wx.EVT_MENU, output.DisableOutput, id=mID)
+
+ # Attach the menu to our menu bar
+ menubar.Append(menu, "&Output")
+
+ # Attach menu bar to frame
self.SetMenuBar(menubar)
+
+ # Point to ourselves as the output object's parent.
output.SetParent(self)
- output.SetOtherMenuBar(menubar,menuname="Output")
- EVT_CLOSE(self,self.OnClose)
- EVT_TIMER(self, -1, self.OnTimer)
+
+ # Associate menu bar with output object
+ output.SetOtherMenuBar(menubar, menuname="Output")
- self.timer = wxTimer(self, -1)
+ self.Bind(wx.EVT_CLOSE, self.OnClose)
+ # We're going to set up a timer; set up an event handler for it.
+ self.Bind(wx.EVT_TIMER, self.OnTimer)
+
+ # Set up a timer for demo purposes
+ self.timer = wx.Timer(self, -1)
self.timer.Start(1000)
+ # Get a copy of stdout and set it aside. We'll use it later.
self.save_stdout = sys.stdout
+
+ # Now point to the output object for stdout
sys.stdout = self.output = output
+ # ... and use it.
print "Hello!"
def OnClose(self,event):
+ # We stored a pointer to the original stdout above in .__init__(), and
+ # here we restore it before closing the window.
sys.stdout = self.save_stdout
+
+ # Clean up
self.output.close()
self.timer.Stop()
self.timer = None
+
self.Destroy()
+ # Event handler for timer events.
def OnTimer(self, evt):
print "This was printed with \"print\""
#----------------------------------------------------------------------
-from wxPython.lib import infoframe
-overview = infoframe.__doc__
+overview = wx.lib.infoframe.__doc__
def runTest(frame, nb, log):
"""
This method is used by the wxPython Demo Framework for integrating
this demo with the rest.
"""
- win = MyFrame(wxPyInformationalMessagesFrame())
+ win = MyFrame(wx.lib.infoframe.PyInformationalMessagesFrame())
frame.otherWin = win
win.Show(1)
## EVT_CLOSE(self,self.OnClose)
## menubar = wxMenuBar()
## menu = wxMenu()
-## mID = NewId()
+## mID = wxNewId()
## menu.Append(mID,"&Enable output","Display output frame")
## EVT_MENU(self,mID,output.EnableOutput)
-## mID = NewId()
+## mID = wxNewId()
## menu.Append(mID,"&Disable output","Close output frame")
## EVT_MENU(self,mID,output.DisableOutput)
## menubar.Append(menu,"&Output")
## output.SetOtherMenuBar(menubar,menuname="Output")
## def OnClose(self,event):
-## if isinstance(sys.stdout,wxPyInformationalMessagesFrame):
+## if isinstance(sys.stdout,wx.lib.infoframe.PyInformationalMessagesFrame):
## sys.stdout.close()
## self.Destroy()
- class MyApp(wxApp):
- outputWindowClass = wxPyInformationalMessagesFrame
+ class MyApp(wx.App):
+
+ # Override the default output window and point it to the
+ # custom class.
+ outputWindowClass = wx.lib.infoframe.PyInformationalMessagesFrame
+
def OnInit(self):
+
+ # At this point, we should probably check to see if self.stdioWin
+ # is actually pointed to something. By default, wx.App() sets this
+ # attribute to None. This causes problems when setting up the menus
+ # in MyFrame() above. On the other hand, since there's little that
+ # can be done at this point, you might be better served putting
+ # an error handler directly into MyFrame().
+ #
+ # That's in practice. In the case of this demo, the whole point
+ # of the exercise is to demonstrate the window, so we're being
+ # just a little lazy for clarity's sake. But do be careful in
+ # a 'real world' implementation :-)
+
frame = MyFrame(self.stdioWin)
frame.Show(True)
self.SetTopWindow(frame)
- if isinstance(sys.stdout,wxPyInformationalMessagesFrame):
+
+ # Associate the frame with stdout.
+ if isinstance(sys.stdout, wx.lib.infoframe.PyInformationalMessagesFrame):
sys.stdout.SetParent(frame)
- #self.redirectStdio(None)# this is done automatically
- # by the MyApp(1) call below
+
print "Starting.\n",
return True
- app = MyApp(1)
+ # *extremely important*
+ #
+ # In this demo, if the redirect flag is set to False, the infoframe will not
+ # be created or used. All output will go to the default stdout, which in this
+ # case will cause the app to throw an exception. In a real app, you should
+ # probably plan ahead and add a check before forging ahead. See suggestion above.
+ app = MyApp(True)
app.MainLoop()