scroll a frame to display several lines of widgets at a time
matt.hammond at rd.bbc.co.uk
Fri Sep 2 13:02:31 CEST 2005
I don't quite understand (if I'm interpreting you correctly) why you want
separate widgets, all displayed at once, for several hundred records -
surely better to just reuse the one set of widgets and have the scrollbar
or back-forward buttons change which record is being displayed in the
If you're after replacing widgets, then you need to destroy them first.
Use the self.destroy method and unset/change any variables referencing the
widget so it get a chance to be garbage collected.
However, if you want a scrollable view onto a larger area, what you need
to do is use a Canvas, with a window shape on it. You then put a frame
into that window.
canvas = Tkinter.Canvas( <parent> )
canvas.grid( ... )
winID = self.canvas.create_window(0,0, anchor=Tkinter.NW)
Then later you can add a frame to that window on the canvas:
canvas.itemconfigure( winID, window = <my frame> )
canvas['scrollregion'] = canvas.bbox('all')
Make sure you've created the frame and perhaps called update_idletasks()
to give it a chance to size itself before shoving it onto the canvas.
And of course, the scrollbar!
yscroll = Tkinter.Scrollbar( <parent>, orient=Tkinter.VERTICAL)
yscroll.grid( ... )
yscroll['command'] = canvas.yview
canvas['yscrollcommand'] = yscroll.set
On Thu, 01 Sep 2005 14:33:36 +0100, William Gill <noreply at gcgroup.net>
> I need to display a couple of labels and a checkbox from each entry in
> my database. Simple enough, but there are several hundred records, and
> I only want to display 5 or 10 at a time. Can this be accomplished by
> putting everything in a Frame(), using width, height, grid_propagate(0)
> , and a scrollbar? or do I have to grid 5 rows at a time? If the
> latter, can I just grid over the previous 5 or do they have to be
> explicitly removed first.
| Matt Hammond
| R&D Engineer, BBC Research and Development, Tadworth, Surrey, UK.
More information about the Python-list