如何将滚动条应用于画布中的框架

时间:2011-09-16 07:38:11

标签: python user-interface tkinter

我很难在tkinter中尝试实现一个明确的GUI布局。我的目标是左侧的布局,但没有比右侧的布局更进一步:

enter image description here enter image description here

我觉得在所有不同的布局管理器中完全迷失了。到目前为止,这是我的代码:

from Tkinter import *

class ScrolledCanvas:
    def __init__(self, master, width=500, height=350):
        Label(master, text="top of master frame").pack(side=TOP)
        self.control=Frame(master)
        self.control.pack(side=BOTTOM, fill=X, padx=2)
        Label(self.control, text="bottom of master frame").pack()
        self.grid = Frame(master, bd=2, bg="red")
        self.canvas = Canvas(master, relief=SUNKEN, borderwidth=2, 
                             scrollregion=('-11c', '-11c', '50c', '20c')) 
        self.vscroll = Scrollbar(master, command=self.canvas.yview) 
        self.canvas.configure(yscrollcommand=self.vscroll.set) 

        self.grid.pack(expand=YES, fill=BOTH, padx=1, pady=1)
        self.grid.rowconfigure(0, weight=1, minsize=0)
        self.grid.columnconfigure(0, weight=1, minsize=0)

        self.canvas.grid(padx=1, in_=self.grid, pady=1, row=0,
                         column=0, rowspan=1, columnspan=1, sticky='news')
        self.vscroll.grid(padx=1, in_=self.grid, pady=1, row=0,
                          column=1, rowspan=1, columnspan=1, sticky='news')
        self.oldFill = None
        self.canvas = self.fillCanvas(self.canvas)

    def fillCanvas(self, theCanvas):
        for i in range(10):
            frame = Frame(theCanvas)
            Label(frame, text="text for inner frame (%s)" % i).pack(side=TOP)
            Button(frame, text="button %s.1" % i).pack(side=LEFT)
            Button(frame, text="button %s.2" % i).pack(side=LEFT)
            frame.pack()
        return theCanvas

if __name__ == '__main__':
    root = Tk()
    scroll = ScrolledCanvas(root)
    root.mainloop()

由于某种原因,scrollregion扩展为完整大小,使所有滚动条操作都过时(此代码基于滚动条示例,其中画布填充了一些矩形,并且所有内容都滚动得非常好)。我可能错过了一些关于调整大小的基本知识,因为大多数组件似乎完全忽略了它们固定的宽度和高度。

我正在寻找有关如何使此示例与tkinter一起使用的帮助。我知道还有其他布局技术,我知道其他模块提供开箱即用的可滚动小部件。但除非完全不可避免,否则我真的很想坚持这个例子,到目前为止我花了至少3个晚上......

1 个答案:

答案 0 :(得分:4)

您无法将小部件打包(或网格化或放置)到画布中并期望它们滚动。相反,您必须使用create_window方法。