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