git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@7748 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			158 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| from wxPython.wx import *
 | |
| 
 | |
| #-------------------------------------------------------------------
 | |
| # class MyWindow(wxScrolledWindow):
 | |
| #----------------------------------
 | |
| # Copes with the drawing of the main scrolled window.
 | |
| #
 | |
| # Data members:
 | |
| #  num - <int> number of list entries
 | |
| #  ostart - <int> line number of the top line of the previous redraw
 | |
| #  vw - <int> width of the viewing window
 | |
| #  vh - <int> height of the viewing window
 | |
| #  smalltext - <int> 0 = size 12pt, 1 = size 9pt text
 | |
| #
 | |
| # Method members:
 | |
| #  OnPaint(evt) - basic draw handler
 | |
| #  OnDraw(dc) - called by OnPaint, redraws the screen if required
 | |
| #  update(updatelist) - called every 3 seconds if updates are needed.
 | |
| 
 | |
| class MyWindow(wxScrolledWindow):
 | |
|   def __init__(self,num,parent,id,pos,size,style):
 | |
|     wxScrolledWindow.__init__(self,parent,id,pos,size,style)
 | |
|     self.SetBackgroundColour(wxWHITE)
 | |
| 
 | |
|     self.num=num
 | |
|     self.ostart=0
 | |
|     self.smalltext = 0
 | |
|     self.vw,self.vh=self.GetClientSizeTuple()
 | |
| 
 | |
|     # calculate font pt size needed: a bit of a kludge to get round
 | |
|     # font compatibility problems of X and Windows.
 | |
|     dc=wxClientDC(self)
 | |
| 
 | |
|     dc.SetFont(wxFont(12,wxDEFAULT,wxNORMAL,wxNORMAL,FALSE))
 | |
|     if dc.GetTextExtent("XXXXXXXXXX")[0] > 100:
 | |
|       self.smalltext = 1
 | |
| 
 | |
|   def OnPaint(self,evt):
 | |
|     """ overriding OnPaint to give handler. """
 | |
|     dc = wxPaintDC(self)
 | |
|     self.PrepareDC(dc)
 | |
|     self.OnDraw(dc)
 | |
| 
 | |
|   def update(self,updlist):
 | |
|     """ handles line by line updating of list entries. """
 | |
|     dc = wxClientDC(self)
 | |
|     self.PrepareDC(dc)
 | |
|     dc.SetBrush(wxWHITE_BRUSH)
 | |
|     dc.SetPen(wxWHITE_PEN)
 | |
| 
 | |
|     if self.smalltext == 1:
 | |
|       dc.SetFont(wxFont(9,wxDEFAULT,wxNORMAL,wxNORMAL,FALSE))
 | |
|     else:
 | |
|       dc.SetFont(wxFont(12,wxDEFAULT,wxNORMAL,wxNORMAL,FALSE))
 | |
| 
 | |
|     dc.BeginDrawing()
 | |
| 
 | |
|     for i in updlist:
 | |
|       if i >= self.ostart and i < self.ostart+self.vh/17+1:
 | |
|         dc.DrawRectangle(0,i*17,self.vw,17)
 | |
|         dc.DrawText("This is a simple test.Line "+str(i)+".",
 | |
|                     10,i*17+2)
 | |
|     dc.EndDrawing()
 | |
| 
 | |
|   def OnDraw(self,dc):
 | |
|     """ Main redraw function. """
 | |
| 
 | |
|     if self.smalltext == 1:
 | |
|       dc.SetFont(wxFont(9,wxDEFAULT,wxNORMAL,wxNORMAL,FALSE))
 | |
|     else:
 | |
|       dc.SetFont(wxFont(12,wxDEFAULT,wxNORMAL,wxNORMAL,FALSE))
 | |
| 
 | |
|     vx,vstart=self.ViewStart()
 | |
|     self.vw,self.vh=self.GetClientSizeTuple()
 | |
|     vend=vstart+(self.vh/17) + 1
 | |
|     if vend > self.num: vend = self.num
 | |
| 
 | |
|     dc.BeginDrawing()
 | |
|     if vstart > self.ostart: # if moving downwards...
 | |
|       for i in range(vend-(vstart-self.ostart+1),vend):
 | |
|         dc.DrawText("This is a simple test. Line "+str(i)+".",
 | |
|                     10,i*17+2)
 | |
| 
 | |
|     elif vstart < self.ostart: # if moving upwards...
 | |
|       for i in range(vstart,self.ostart):
 | |
|         dc.DrawText("This is a simple test. Line "+str(i)+".",
 | |
|                     10,i*17+2)
 | |
| 
 | |
|     elif vstart == self.ostart: # if not moving (redraw)...
 | |
|       #dc.Clear()
 | |
|       for i in range(vstart,vend):
 | |
|         dc.DrawText("This is a simple test. Line "+str(i)+".",
 | |
|                     10,i*17+2)
 | |
| 
 | |
|     dc.EndDrawing()
 | |
|     self.ostart=vstart
 | |
| 
 | |
| #--------------------------------------------------------------------
 | |
| 
 | |
| class MyTimer(wxTimer):
 | |
|   def __init__(self,frame):
 | |
|     wxTimer.__init__(self)
 | |
|     self.frame_ = frame
 | |
| 
 | |
|   def Notify(self):
 | |
|     self.frame_.idle()
 | |
| 
 | |
| 
 | |
| class MyFrame(wxFrame):
 | |
|   def __init__(self, parent, id, title):
 | |
|     wxFrame.__init__(self, parent, id, title,
 | |
|                      wxPoint(100, 100), wxSize(500, 300))
 | |
| 
 | |
|     # number of entries
 | |
|     self.num = 30
 | |
| 
 | |
|     # set up the scrolling window...
 | |
|     self.sw = MyWindow(self.num,self, -1,
 | |
|                        wxDefaultPosition, wxDefaultSize,
 | |
|                        wxVSCROLL|wxSUNKEN_BORDER)
 | |
| 
 | |
|     self.sw.SetScrollbars(1,17,0,self.num+1)
 | |
| 
 | |
|     lc = wxLayoutConstraints()
 | |
|     lc.top.SameAs(self, wxTop, 5)
 | |
|     lc.left.SameAs(self, wxLeft, 5)
 | |
|     lc.bottom.SameAs(self, wxBottom, 5)
 | |
|     lc.right.SameAs(self, wxRight,5)
 | |
|     self.sw.SetConstraints(lc)
 | |
| 
 | |
|     self.timer=MyTimer(self)
 | |
|     # stupidly short interval time to accelerate memory leak problem:
 | |
|     self.timer.Start(80)
 | |
| 
 | |
|   def idle(self):
 | |
|     #usually just update one or two lines; to accelerate problem,
 | |
|     #every line is updated here.
 | |
|     self.sw.update(range(self.num))
 | |
| 
 | |
| 
 | |
| ######################################################################
 | |
| # Main procedure....
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|   class MyApp(wxApp):
 | |
|     def OnInit(self):
 | |
| 
 | |
|       self.frame = MyFrame(NULL, -1, "Memory Leak Tester")
 | |
|       self.frame.Show(true)
 | |
| 
 | |
|       self.exiting = FALSE;
 | |
|       return true
 | |
| 
 | |
|   app = MyApp(0)     # Create an instance of the application class
 | |
|   app.MainLoop()     # Tell it to start processing events
 | |
| 
 |