git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25140 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			123 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
 | 
						|
import  time
 | 
						|
import  wx
 | 
						|
 | 
						|
#---------------------------------------------------------------------------
 | 
						|
 | 
						|
class CustomStatusBar(wx.StatusBar):
 | 
						|
    def __init__(self, parent, log):
 | 
						|
        wx.StatusBar.__init__(self, parent, -1)
 | 
						|
 | 
						|
        # This status bar has three fields
 | 
						|
        self.SetFieldsCount(3)
 | 
						|
        # Sets the three fields to be relative widths to each other.
 | 
						|
        self.SetStatusWidths([-2, -1, -2])
 | 
						|
        self.log = log
 | 
						|
        self.sizeChanged = False
 | 
						|
        self.Bind(wx.EVT_SIZE, self.OnSize)
 | 
						|
        self.Bind(wx.EVT_IDLE, self.OnIdle)
 | 
						|
 | 
						|
        # Field 0 ... just text
 | 
						|
        self.SetStatusText("A Custom StatusBar...", 0)
 | 
						|
 | 
						|
        # This will fall into field 1 (the second field)
 | 
						|
        self.cb = wx.CheckBox(self, 1001, "toggle clock")
 | 
						|
        self.Bind(wx.EVT_CHECKBOX, self.OnToggleClock, self.cb)
 | 
						|
        self.cb.SetValue(True)
 | 
						|
 | 
						|
        # set the initial position of the checkbox
 | 
						|
        self.Reposition()
 | 
						|
 | 
						|
        # We're going to use a timer to drive a 'clock' in the last
 | 
						|
        # field.
 | 
						|
        self.timer = wx.PyTimer(self.Notify)
 | 
						|
        self.timer.Start(1000)
 | 
						|
        self.Notify()
 | 
						|
 | 
						|
 | 
						|
    # Handles events from the timer we started in __init__().
 | 
						|
    # We're using it to drive a 'clock' in field 2 (the third field).
 | 
						|
    def Notify(self):
 | 
						|
        t = time.localtime(time.time())
 | 
						|
        st = time.strftime("%d-%b-%Y   %I:%M:%S", t)
 | 
						|
        self.SetStatusText(st, 2)
 | 
						|
        self.log.WriteText("tick...\n")
 | 
						|
 | 
						|
 | 
						|
    # the checkbox was clicked
 | 
						|
    def OnToggleClock(self, event):
 | 
						|
        if self.cb.GetValue():
 | 
						|
            self.timer.Start(1000)
 | 
						|
            self.Notify()
 | 
						|
        else:
 | 
						|
            self.timer.Stop()
 | 
						|
 | 
						|
 | 
						|
    def OnSize(self, evt):
 | 
						|
        self.Reposition()  # for normal size events
 | 
						|
 | 
						|
        # Set a flag so the idle time handler will also do the repositioning.
 | 
						|
        # It is done this way to get around a buglet where GetFieldRect is not
 | 
						|
        # accurate during the EVT_SIZE resulting from a frame maximize.
 | 
						|
        self.sizeChanged = True
 | 
						|
 | 
						|
 | 
						|
    def OnIdle(self, evt):
 | 
						|
        if self.sizeChanged:
 | 
						|
            self.Reposition()
 | 
						|
 | 
						|
 | 
						|
    # reposition the checkbox
 | 
						|
    def Reposition(self):
 | 
						|
        rect = self.GetFieldRect(1)
 | 
						|
        self.cb.SetPosition((rect.x+2, rect.y+2))
 | 
						|
        self.cb.SetSize((rect.width-4, rect.height-4))
 | 
						|
        self.sizeChanged = False
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class TestCustomStatusBar(wx.Frame):
 | 
						|
    def __init__(self, parent, log):
 | 
						|
        wx.Frame.__init__(self, parent, -1, 'Test Custom StatusBar')
 | 
						|
 | 
						|
        self.sb = CustomStatusBar(self, log)
 | 
						|
        self.SetStatusBar(self.sb)
 | 
						|
        tc = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY|wx.TE_MULTILINE)
 | 
						|
 | 
						|
        self.SetSize((500, 300))
 | 
						|
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
 | 
						|
 | 
						|
    def OnCloseWindow(self, event):
 | 
						|
        self.sb.timer.Stop()
 | 
						|
        del self.sb.timer
 | 
						|
        self.Destroy()
 | 
						|
 | 
						|
#---------------------------------------------------------------------------
 | 
						|
 | 
						|
def runTest(frame, nb, log):
 | 
						|
    win = TestCustomStatusBar(frame, log)
 | 
						|
    frame.otherWin = win
 | 
						|
    win.Show(True)
 | 
						|
 | 
						|
#---------------------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
overview = """\
 | 
						|
A status bar is a narrow window that can be placed along the bottom of
 | 
						|
a frame to give small amounts of status information. It can contain
 | 
						|
one or more fields, one or more of which can be variable length
 | 
						|
according to the size of the window.  
 | 
						|
 | 
						|
This example demonstrates how to create a custom status bar with actual
 | 
						|
gadgets embedded in it. In this case, the first field is just plain text,
 | 
						|
The second one has a checkbox that enables the timer, and the third
 | 
						|
field has a clock that shows the current time when it is enabled.
 | 
						|
 | 
						|
"""
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    import sys,os
 | 
						|
    import run
 | 
						|
    run.main(['', os.path.basename(sys.argv[0])])
 |