Tkinter: how to refresh a canvas without duplicates?

Stewart Midwinter stewart at midtoad.homelinux.org
Sat Feb 28 03:13:36 EST 2004


I've got a Tkinter app that draws three histograms.  At this point I am
simulating real data by drawing rectangles whose size is defined by random
numbers; in the future there would be real data coming from a server. 

I want to redraw the rectangles every time I press the Again button.  This works
for me, but I get an extra set of rectangles each time I press the Again button.
How to get rid of this effect?

Here's the app so you can see the behaviour:

Thanks
S

---
title = 'Histogram summary'

# Import Pmw from this directory tree.
import sys
sys.path[:0] = ['../../..']

from Tkinter import *
import Pmw
import random

global canwidth, canheight, sectors, barcolors
sectors = 'SECT_1','SECT_2','SECT_3'
barcolors = 'green','yellow','red','violet'
canwidth = 200
canheight = 20


class Summary:
    def __init__(self, parent):
	# Create the dialog.
	self.dialog = Pmw.Dialog(parent,
	    buttons = ('OK', 'Apply', 'Cancel', 'Help'),
	    defaultbutton = 'OK',
	    title = 'My dialog',
	    command = self.execute)
	self.dialog.withdraw()

	# Add some contents to the dialog.
	w = Label(self.dialog.interior(),
	    text = 'Sector Summary',
	    background = 'black',
	    foreground = 'white',
	    pady = 20)
	w.pack(expand = 1, fill = 'both', padx = 2, pady = 2)
	

    def drawRec(self):
        global row,can
	for sector in sectors:
		row = Frame(self.dialog.interior())
		lab = Label(row, width=10,text=sector)
		can = Canvas(row,
			width=canwidth,
			height=canheight
			)
	
                h=canheight
                m=canwidth-20 # alarm level (100%) is less than available space
for rectangle                d=canwidth/2
                p=random.randrange(-1,2,2) # create random + or - imbalance
                f=random.randrange(-110,110,1)/100.0 # create random fractional
height of bar                w=f*m
                startx=d+f*d
                starty=0
                endx=d
                endy=h
                if (f<-1.0):
                    rcolor='violet'
                elif (-1.0<=f<0.85):
                    rcolor='green'
                elif (0.85<f<=1.0):
                    rcolor='yellow'
                elif (f>1.0):
                    rcolor='red'
                else:
                    rcolor='grey'
               
can.create_rectangle(startx,starty,endx,endy,width=1,fill=rcolor)               
row.pack(side=TOP, fill=X)                lab.pack(side=LEFT)
                can.pack(side=LEFT, expand=0, padx = 1, pady = 1) #grow
horizontal        self.dialog.activate(globalMode = 'nograb')

    def redrawRec(self):
        self.dialog.deactivate()
        for sector in sectors:
            row.destroy()
        self.drawRec()
        self.dialog.activate()
        
    def execute(self, result):
	print 'You clicked on', result
	if result not in ('Apply', 'Help'):
	    self.dialog.deactivate(result)
	if (result =='Apply'):
            self.redrawRec()
            
######################################################################

# Create demo in root window for testing.
if __name__ == '__main__':
    root = Tk()
    #Pmw.initialise(root)
    #root.title(title)

    widget = Summary(root)
    goButton = Button(root, text = 'Again', command = lambda: widget.drawRec())
    goButton.pack(side = 'bottom')
    exitButton = Button(root, text = 'Exit', command = root.destroy)
    exitButton.pack(side = 'bottom')
    widget.drawRec()
    root.mainloop()
---





More information about the Python-list mailing list