首页 > 解决方案 > Tkinter 滚动框架:扩展框架以适应一个方向的内容画布

问题描述

我正在尝试制作一个具有设定高度的框架和一个响应鼠标滚动事件的垂直滚动条。框架需要包含框架,所以没有我可以使用的内置 Tk 小部件。这是我正在使用的 Python 3 代码,来自这里的几个相关答案:

import tkinter as tk

class VertScrollingFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.canvas = tk.Canvas(root)
        self.frame = tk.Frame(self.canvas)
        self.bar = tk.Scrollbar(root, orient = "vertical", command = self.canvas.yview)
        self.bar.lift(self.frame)
        self.canvas.configure(yscrollcommand = self.bar.set)

        self.bar.pack(side = "right", fill = "y")
        self.canvas.pack(side = "left", fill = 'both', expand = True)
        self.canvas.create_window(
            (4, 4),
            window = self.frame,
            anchor = "nw", 
            tags = "self.frame",
        )
        #self.frame.pack()

        def on_cfg(_):
            self.canvas.configure(scrollregion = self.canvas.bbox("all"))
        self.frame.bind('<Configure>', on_cfg)

        def on_scroll(event):
            if event.delta:
                amount = round(-event.delta / 120)
            else:
                amount = {4: -1, 5: 1}[event.num] * 2
            self.canvas.yview_scroll(amount, "units")

        bind_keys = {'<MouseWheel>', '<Button-4>', '<Button-5>'}
        def scroll_bind(_):
            for key in bind_keys:
                self.canvas.bind_all(key, on_scroll)
        def scroll_unbind(_):
            for key in bind_keys:
                self.canvas.unbind_all(key)

        self.frame.bind('<Enter>', scroll_bind)
        self.frame.bind('<Leave>', scroll_unbind)

root = tk.Tk()
win = tk.Toplevel(root)
sf = VertScrollingFrame(win)
for _ in range(20):
    f = tk.Frame(sf.frame)
    for x in range(12):
        tk.Button(f, text = str(x)).pack(side = 'left')
    f.pack()
sf.pack()
root.mainloop()

我已经用宽广的按钮网格填充了滚动框架,并且画布似乎正在水平调整大小以适应它们,但事实ScrollingFrame并非如此。它只是切断了内容的右侧。如何使框架扩展以水平适应其内容?

通过调用self.frame.pack()uncommented,我得到了一个不同的错误结果:按钮网格在垂直和水平方向上都被奇怪地裁剪了,并且没有什么可以滚动的。

标签: pythontkintertkinter-canvas

解决方案


推荐阅读