By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,106 Members | 2,474 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,106 IT Pros & Developers. It's quick & easy.

Tkinter: how to refresh a canvas without duplicates?

P: n/a
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()
---
Jul 18 '05 #1
Share this question for a faster answer!
Share on Google+

This discussion thread is closed

Replies have been disabled for this discussion.