在Tkinter的Canvas上的滚动条

时间:2012-01-20 19:27:33

标签: tkinter

我意识到此问题以及之前的其他论坛已经提出了某种形式的问题。我已经阅读了所有这些内容,并且每个小时都在努力解决这些问题,我仍然无法得到它。目标只是一个新窗口(Toplevel),其中有一个可滚动的画布,其中有一个框架,其中包含一些内容。我仍然无法让画布上的滚动条起作用:

        #make new window
        self.edit_window = Tkinter.Toplevel()
        self.edit_window.title("Data Refinement")
        self.edit_window.maxsize(height='50', width='300')

        #make scrollbar for canvas
        cScrollbar = Tkinter.Scrollbar(self.edit_window)
        cScrollbar.pack(side=Tkconstants.RIGHT, fill=Tkconstants.Y)

        #make canvas
        canvas = Tkinter.Canvas(self.edit_window)

        #attach canvas to scrollbar
        canvas.config(yscrollcommand=cScrollbar.set)
        cScrollbar.config(command=canvas.yview) 

        #make frame and put everything in frame
        frame = Tkinter.Frame(self.edit_window)

        #random fill
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()

        #scrollbar for listbox
        scrollbar = Tkinter.Scrollbar(frame)
        scrollbar.pack(side=Tkconstants.RIGHT, fill=Tkconstants.Y)

        listbox = Tkinter.Listbox(frame)
        listbox.pack()

        #insert some random data for now into listbox
        for i in range(100):
            listbox.insert(Tkconstants.END, i)

        # attach listbox to scrollbar
        listbox.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=listbox.yview)

        #pack and attach to canvas
        frame.pack(fill=Tkconstants.BOTH, expand=Tkconstants.YES)
        canvas.create_window(0,0, anchor = Tkconstants.NW, window = frame)

        canvas.pack(fill=Tkconstants.BOTH, expand=Tkconstants.YES)
        canvas.config(scrollregion=canvas.bbox(Tkconstants.ALL))

因此,框架已成功完成内容。并且框架成功附加到画布上。我没有得到的是附加到列表框的滚动条工作,而连接到画布的滚动条显示但实际上不起作用。滚动条的作用就像所有内容都已显示一样。就像它滚动显示的内容而不是滚动画布的整个内容。

1 个答案:

答案 0 :(得分:1)

我现在不是在计算机上验证,但我的猜测是这样的:框架的高度将为1,直到窗口小部件被映射,此时它将增长或缩小以适合其内容。但是,在此之前设置canvas滚动区域,因此滚动区域实际上为零。您可以通过打印出命令canvas.bbox(Tkconstants.ALL)

的结果来验证这一点

尝试在配置滚动区域之前添加对self.update_idletasks的调用,看看是否修复了它。