git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25140 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			149 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| import  sys
 | |
| 
 | |
| import  wx
 | |
| import  wx.lib.infoframe
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| 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)
 | |
|         
 | |
|         # Associate menu bar with output object
 | |
|         output.SetOtherMenuBar(menubar, menuname="Output")
 | |
| 
 | |
|         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\""
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| 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(wx.lib.infoframe.PyInformationalMessagesFrame())
 | |
|     frame.otherWin = win
 | |
|     win.Show(1)
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| if __name__ == "__main__":
 | |
| ##     class MyFrame(wxFrame):
 | |
| ##         def __init__(self,output):
 | |
| ##             wxFrame.__init__(self,None,-1,"Close me...",size=(300,100))
 | |
| ##             EVT_CLOSE(self,self.OnClose)
 | |
| ##             menubar = wxMenuBar()
 | |
| ##             menu = wxMenu()
 | |
| ##             mID = wxNewId()
 | |
| ##             menu.Append(mID,"&Enable output","Display output frame")
 | |
| ##             EVT_MENU(self,mID,output.EnableOutput)
 | |
| ##             mID = wxNewId()
 | |
| ##             menu.Append(mID,"&Disable output","Close output frame")
 | |
| ##             EVT_MENU(self,mID,output.DisableOutput)
 | |
| ##             menubar.Append(menu,"&Output")
 | |
| ##             self.SetMenuBar(menubar)
 | |
| ##             output.SetOtherMenuBar(menubar,menuname="Output")
 | |
| 
 | |
| ##         def OnClose(self,event):
 | |
| ##             if isinstance(sys.stdout,wx.lib.infoframe.PyInformationalMessagesFrame):
 | |
| ##                 sys.stdout.close()
 | |
| ##             self.Destroy()
 | |
| 
 | |
|     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)
 | |
|             
 | |
|             # Associate the frame with stdout.
 | |
|             if isinstance(sys.stdout, wx.lib.infoframe.PyInformationalMessagesFrame):
 | |
|                 sys.stdout.SetParent(frame)
 | |
| 
 | |
|             print "Starting.\n",
 | |
|             return True
 | |
| 
 | |
|     # *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()
 |