为什么我点了几次按钮后没有出现滚动条?

Why doesn't my scrolbar appear after clicking the button several times?

我制作了框架,框架内还有其他框架 - 最里面的框架中有条目。 (条目未包含在粘贴的代码中,因为它太长了)通过单击按钮,我在新行中添加了一个新框架。当我添加太多帧以致于屏幕已满时,滚动条应该看起来能够滚动。但事实并非如此,滚动条由于某种原因没有显示。

from tkinter import *
from tkinter import ttk

root = Tk()
root.state('zoomed')

class Window:
    def __init__(self, master):
        this_is_a_frame = Frame(master)
        this_is_a_frame.pack(fill=BOTH, expand=1)
        self.this_is_a_canvas = Canvas(this_is_a_frame)
        self.this_is_a_canvas.pack(side=LEFT, fill=BOTH, expand=1)
        this_is_a_scrollbal = ttk.Scrollbar(this_is_a_frame, orient=VERTICAL, command=self.this_is_a_canvas.yview)
        this_is_a_scrollbal.pack(side=RIGHT, fill=Y)
        self.this_is_a_canvas.configure(yscrollcommand=this_is_a_scrollbal.set)
        self.this_is_a_canvas.bind('<Configure>',
                                   lambda e: self.this_is_a_canvas.configure(
                                       scrollregion=self.this_is_a_canvas.bbox('all')))
        this_second_frame = Frame(self.this_is_a_canvas)
        self.this_is_a_canvas.create_window((0, 0), window=this_second_frame, anchor='nw')
        self.main_frame = Frame(this_second_frame)
        self.main_frame.pack()
        self.main_frame.configure(bg='pink')
        self.my_frame = Frame(self.main_frame, highlightbackground="orange", highlightthickness=2)
        self.my_frame.pack()
        self.my_frame.configure(bg='green')
        self.my_other_frame = Frame(this_second_frame)
        self.my_other_frame.pack()
        self.my_other_frame.configure(bg='blue')

        self.col = 4
        for j in range(9):
            self.myLab = Label(self.my_frame, text='label').grid(row=0, column=j + 1)
            self.myLab_2 = Label(self.my_frame, text='label').grid(row=2, column=j + 1)
            for k in range(1):
                self.myEntry_loop = Entry(self.my_frame)
                self.myEntry_loop.grid(row=k + 1, column=j + 1, pady=10, padx=10)
                self.myEntry_loop_2 = Entry(self.my_frame)
                self.myEntry_loop_2.grid(row=k + 3, column=j + 1, pady=10, padx=10)

        self.myButton_newLevel = Button(self.my_other_frame, text="new frame", command=self.new_level)
        self.myButton_newLevel.grid(row=self.col, column=0, padx=10)

        def _on_mouse_wheel(event):
            self.this_is_a_canvas.yview_scroll(-1 * int((event.delta / 120)), "units")

            self.this_is_a_canvas.bind_all("<MouseWheel>", _on_mouse_wheel)

    def new_level(self):
        self.my_frame = Frame(self.main_frame, highlightbackground="orange", highlightthickness=2)
        self.my_frame.pack(side=TOP, fill=X)

        for j in range(9):
            self.myLab = Label(self.my_frame, text='new label').grid(row=0, column=j + 1)
            self.myLab_2 = Label(self.my_frame, text='new label').grid(row=2, column=j + 1)
            for k in range(1):
                self.myEntry_loop = Entry(self.my_frame)
                self.myEntry_loop.grid(row=k + 1, column=j + 1, pady=10, padx=10)
                self.myEntry_loop_2 = Entry(self.my_frame)
                self.myEntry_loop_2.grid(row=k + 3, column=j + 1, pady=10, padx=10)


val = Window(root)
root.mainloop()

所以,我做错了什么?如何在满屏时向下滚动?

您将 <Configure> 事件绑定到错误的小部件上,您应该绑定到 this_second_frame 而不是 self.this_is_a_canvas:

        """
        # not bind on "self.this_is_a_canvas"
        self.this_is_a_canvas.bind('<Configure>',
                                   lambda e: self.this_is_a_canvas.configure(
                                       scrollregion=self.this_is_a_canvas.bbox('all')))
        """
        this_second_frame = Frame(self.this_is_a_canvas)
        self.this_is_a_canvas.create_window((0, 0), window=this_second_frame, anchor='nw')
        # bind on "this_second_frame" instead
        this_second_frame.bind('<Configure>',
                                   lambda e: self.this_is_a_canvas.configure(
                                       scrollregion=self.this_is_a_canvas.bbox('all')))