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
|
||
|
|