如何在画布中的框架上应用滚动条

2 投票
1 回答
5796 浏览
提问于 2025-04-17 02:25

我在用tkinter做图形界面布局时遇到了很大的困难。我想要左边那种布局,但到目前为止只做出了右边那种:

这里输入图片描述 这里输入图片描述

我对各种不同的布局管理器感到完全迷茫。这是我到目前为止写的代码:

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()

出于某种原因,滚动区域扩展到了整个大小,这让所有的滚动条操作都变得没用了(这段代码是基于一个滚动条的例子,画布上填充了一些矩形,滚动起来非常顺畅)。我可能在调整大小方面错过了一些基本的东西,因为大多数组件似乎完全忽略了它们的固定宽度和高度。

我希望能得到一些帮助,让这个例子在tkinter中正常工作。我知道还有其他布局技术,也知道其他模块提供了现成的可滚动组件。但除非完全没有办法,我真的很想坚持这个例子,到现在为止我已经花了至少三个晚上了……

1 个回答

4

你不能直接把小部件放到画布里,然后指望它们能滚动。相反,你需要使用create_window这个方法。

撰写回答