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

Python 如何将滚动条应用于画布中的框架,python,user-interface,tkinter,Python,User Interface,Tkinter,我很难在tkinter中实现Decedent GUI布局。我的目标是左边的布局,但除了右边的布局,我没有得到任何进展: 我完全沉浸在不同的布局管理中。这是我目前的代码: from Tkinter import * class ScrolledCanvas: def __init__(self, master, width=500, height=350): Label(master, text="top of master frame").pack(side=TOP

我很难在tkinter中实现Decedent GUI布局。我的目标是左边的布局,但除了右边的布局,我没有得到任何进展:

我完全沉浸在不同的布局管理中。这是我目前的代码:

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会扩展到全尺寸,从而使所有scrollbar操作都过时(此代码基于一个scrollbar示例,其中画布上填充了一些矩形,所有内容都可以很好地滚动)。我可能错过了一些关于调整大小的基本信息,因为大多数组件似乎完全忽略了它们的固定宽度和高度


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

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

谢谢,这真是让人大开眼界!!!虽然这样可以让画布按我想要的方式滚动,但这给我带来了一个新问题,那就是我必须在画布上手动定位帧,还是我弄错了?在我的应用程序中,帧的数量和大小会有所不同-所以我希望我可以创建每个帧,并将其留给某种布局管理器,以便将它们很好地放置在彼此的顶部。。。我有机会做到这一点吗?(我不喜欢canvas小部件,我只是在寻找小部件的任何工作组合,以获得所需的布局…)是的,您必须手动定位它们。通常我要做的是为所有内容创建一个框架,并将内容打包(或网格化,或放置)到该框架中。然后,我只需将这一帧添加到画布上。这样就变得非常容易管理了。另一个技巧是绑定到画布的
事件——只要调整画布的大小,就会触发该事件。然后,您可以使用该事件中的信息来调整该帧的大小,以完全适合画布的宽度。再次感谢,我将按照您建议的方式进行调整。我知道这有点旧,但您可能希望查看以下内容: