手动插入框架集滚动条不工作 tkinter

Manually inserting into frame sets scrollbar to not work tkinter

如果小部件在自动(运行时?)期间插入到框架中,我有一个带滚动条的代码可以正常工作。但是一旦我通过按下按钮添加小部件,它就不起作用了。看这里:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.geometry("500x400")

def more():
    tk.Button(second_frame,text='MORE').pack()

main_section = tk.Frame(root,bg='white')
main_section.pack()

scroll_frame = tk.Frame(main_section,bg='white')
scroll_frame.grid(row=3,column=0)

# Create A Canvas
my_canvas = tk.Canvas(scroll_frame,bg='white',borderwidth=0)
my_canvas.pack(side='left', fill='both', expand=1)

# Add A Scrollbar To The Canvas
my_scrollbar = ttk.Scrollbar(scroll_frame, orient='vertical', command=my_canvas.yview)
my_scrollbar.pack(side='right', fill='y')

# Configure The Canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion = my_canvas.bbox("all")))

# Create ANOTHER Frame INSIDE the Canvas
second_frame = tk.Frame(my_canvas,bg='white')

# Add that New frame To a Window In The Canvas
my_canvas.create_window(0,0, window=second_frame, anchor="nw")

tk.Button(second_frame,text='Click for more buttons',command=more).pack()

root.mainloop()

在这里,一旦您按下按钮并创建了更多按钮,滚动条就不会激活,但是如果您在主块中循环,滚动条就会激活。例如:

for a in range(30):
    tk.Button(second_frame,text=a).pack()

如果您想知道为什么有很多帧,这是从更大的代码中取出来制作 MCVE 的。我在这里做错了什么?提前致谢 :D

从未触发此事件:

my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion = my_canvas.bbox("all")))

当您知道您的函数将按钮添加到 second_frame 时,原因就很简单了,这就是为什么 second_frame 将配置在 width身高.

所以在定义 second_frame 之后需要这一行:

second_frame.bind('<Configure>', lambda e: my_canvas.configure(scrollregion = my_canvas.bbox("all")))

您仅在 canvas 更改大小时(或更具体地说,当 <Configure> 事件在 canvas 上触发时)配置 scrollregion

当您向内部框架添加按钮时,不会导致 canvas 改变大小。相反,您需要绑定到内部框架上的 <Configure> 事件,或者在添加按钮后显式重新配置滚动区域。

def more():
    tk.Button(second_frame,text='MORE').pack()
    my_canvas.configure(scrollregion=my_canvas.bbox("all"))