📜  Tkinter 中的可滚动帧(1)

📅  最后修改于: 2023-12-03 14:48:00.020000             🧑  作者: Mango

Tkinter 中的可滚动帧

在 Tkinter 中,如果需要在窗口中显示大量的内容,例如文本或图像,一个常见的问题是如何控制滚动条。一种解决方案是使用可滚动帧。

可滚动帧是一种用于容纳其他部件的小部件,可以在需要时自动添加滚动条。可以在该帧中创建、添加和删除子部件,就像这个帧是一个常规帧一样。

示例代码

以下是一个 Tkinter 应用程序,其中包含一个可滚动帧,您可以用它来显示任意数量的子部件。

import tkinter as tk
from tkinter import ttk

class ScrollableFrame(tk.Frame):
    def __init__(self, container, *args, **kwargs):
        super().__init__(container, *args, **kwargs)

        self.canvas = tk.Canvas(self)
        scrollbar = ttk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
        self.scrollable_frame = tk.Frame(self.canvas)

        self.scrollable_frame.bind(
            "<Configure>",
            lambda e: self.canvas.configure(
                scrollregion=self.canvas.bbox("all")
            )
        )

        self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")

        self.canvas.configure(yscrollcommand=scrollbar.set)

        self.canvas.pack(side="left", fill="both", expand=True)
        scrollbar.pack(side="right", fill="y")

root = tk.Tk()

scrollable_frame = ScrollableFrame(root)
scrollable_frame.pack(side="top", fill="both", expand=True)

for i in range(50):
    tk.Label(scrollable_frame.scrollable_frame, text=f"Sample scrolling label {i+1}").pack()

root.mainloop()

尝试运行此代码,您会发现可以向上下滚动包含 50 个标签的帧。

代码解释

上述代码中的 ScrollableFrame 类是一个继承了标准 Tkinter 帧的自定义控件。在该类中,我们创建了一个带有垂直滚动条的画布。我们还创建了一个子帧,该子帧包含创建的所有子部件。

创建窗口时,.configure() 函数将可滚动帧的滚动区域配置为所有内容的边界框。这里有一些事情需要注意:

  • 我们使用 bind() 函数将子帧的大小更改绑定到.canvas 中的滚动区域。每次修改子帧大小时,都将调用该函数,以确保我们的滚动区域与子帧大小匹配。
  • 我们必须使用 create_window() 将子帧添加到画布中。由于画布允许您将其他部件(例如 tkinter.Label)直接添加到其中,因此它允许我们将一组子部件打包在一起,并同时向用户显示滚动条。

在执行完这些操作后,我们可以放置可滚动帧并向其中添加子部件。

结论

可滚动帧是一个非常方便的方法,可以容纳大量文本或图像。使用标准 Tkinter 部件创建和配置可滚动帧是有点棘手的,但是,这里提供的示例代码可以让您了解如何利用 Tkinter 中的 canvas 和 frame 部件,以创建一个滚动框。