This is the third time I've tried to post this reply.  If you see multiple 
answers from me, that's why.

Your script will work if you change it like so:

from tkinter import *
class ShowList(Frame):
        def __init__(self, root):
                Frame.__init__(self, root)
                self.grid()
                self.draw_widgets()
        def draw_widgets(self):
                cframe = Frame(self)
                cframe.grid(row=1, sticky=N+S+E+W)
                canv = Canvas(cframe)
                canv.grid(row=0, column=0, sticky=N+S+E+W)
                vscroll = Scrollbar(cframe, orient=VERTICAL, command=canv.yview)
                hscroll = Scrollbar(cframe, orient=HORIZONTAL, 
command=canv.xview)
                vscroll.grid(row=0, column=1, sticky=N+S)
                hscroll.grid(row=1, column=0, sticky=E+W)
                canv["xscrollcommand"] = hscroll.set
                canv["yscrollcommand"] = vscroll.set
                aframe = Frame(canv)
                id = canv.create_window(0,0,window=aframe, anchor=N+W)
                for i in range(0,100):
                        Label(aframe, text=str(i), anchor=N+W).grid(row=i, 
column=0)
                aframe.update_idletasks()
                canv["scrollregion"]=canv.bbox(ALL)
root  = Tk()
m=ShowList(root)
root.mainloop()

You need to call update_idletasks to force the canvas to be mapped to the 
screen before you compute the bounding box.  Until it's mapped, the bounding 
box is (0,0,1,1), and of course you need to put the widgets on before you 
compute the bounding box.  You can call update_idletasks through any widget.  

That said, I wonder if it wouldn't be better to put canvas objects directly on 
the canvas, instead of putting widgets in a frame.  The way you'r doing it, you 
can't give the widgets tags, and tags are what give the canvas its power.

Saul
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to