如何添加一个滚动条,将其定位在最顶部的小部件上

How to add a scrollbar that orientes its position on the top most widget

我有一个 tkinter 应用程序,其中有一个包含多个页面(所有页面都是框架)的主 canvas。我使用 frame.tkraise() 命令拉起不同的页面。我现在想给整个东西添加一个滚动条。有滚动条但是没有滑块,不知道能不能识别页面的变化

import tkinter as tk
from tkinter import ttk


class Economics(tk.Tk):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        tk.Tk.columnconfigure(self, 0, weight=1)
        tk.Tk.rowconfigure(self, 0, weight=1)

        self.container = tk.Canvas()
        self.container.grid(row=0, column=0, sticky="nsew")
        self.container.columnconfigure("all", weight=1)
        self.container.rowconfigure("all", weight=1)

        self.vscrollbar = tk.Scrollbar(orient="vertical", command=self.container.yview)

        self.container.configure(yscrollcomman=self.vscrollbar.set)

        self.vscrollbar.grid(row=0, column=1, sticky="ns")

        self.frames = {}

        for F in (StartPage, ExamplePage1, ExamplePage2):                                                             # TUPLE OF PAGES

            frame = F(self.container, self)

            self.frames[F] = frame

        self.show_frame(StartPage)

    def show_frame(self, cont):
        self.container.delete("all")
        frame = self.frames[cont]

        self.container.create_window(0, 0, anchor="nw", window=frame)


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        super().__init__(parent)

        button_1 = ttk.Button(self, text="Example Page 1",
                              command=lambda: controller.show_frame(ExamplePage1))
        button_1.grid(row=0, column=0)

        button_2 = ttk.Button(self, text="Example Page 2",
                              command=lambda: controller.show_frame(ExamplePage2))
        button_2.grid(row=1, column=0)


class ExamplePage1(tk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)

        for i in range(50):
            label = tk.Label(self, text="Button {} of 50".format(i+1))
            label.grid(row=i, column=0)

        button_back = ttk.Button(self, text="Back",
                              command=lambda: controller.show_frame(StartPage))
        button_back.grid(row=0, column=1)


class ExamplePage2(tk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)

        for i in range(35):
            label = tk.Label(self, text="Button {} of 35".format(i+1))
            label.grid(row=i, column=0)

        button_back = ttk.Button(self, text="Back",
                                 command=lambda: controller.show_frame(StartPage))
        button_back.grid(row=0, column=1)

app = Economics()
app.geometry("800x600")
app.resizable(True, True)
app.mainloop()

在此示例文件中,您可以看到我的应用程序的基本结构以及一些示例小部件和按钮。滚动条显示但没有滑块。我必须更改什么才能获得所有页面的工作滚动条。 稍后我也打算得到一个水平滚动条。

您无法使用 packplacegrid 滚动添加到 canvas 的项目。 canvas 只能滚动通过 canvas create_* 函数添加的项目,例如 create_window.