我有一个可水平滚动的框架。这正在按预期工作。 我希望框架能够垂直调整自身大小,以便显示所有小部件。 目前,框架不会随着添加额外的小部件而增长,并且在某个点以下创建的小部件不可见。 我知道我可以使用垂直滚动条,但我非常不愿意这样做。框架将包含可变数量的小部件,但数量绝不会多到需要在垂直方向上滚动。所以我更希望它能自然地朝那个方向调整大小。 这是一个最小的代码示例:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
outer_frm = tk.Frame(root)
outer_frm.grid(column=0, row=0)
canv = tk.Canvas(outer_frm)
canv.grid(column=0, row=0)
inner_frm = tk.Frame(canv)
inner_frm.grid(column=0, row=0)
sbar = ttk.Scrollbar(outer_frm, orient='horizontal', command=canv.xview)
canv.configure(xscrollcommand=sbar.set)
sbar.grid(column=0, row=1, sticky='EW')
inner_frm.bind(
"<Configure>",
lambda e: canv.configure(
scrollregion=canv.bbox("all")
)
)
canv.create_window(
(0,0), window=inner_frm, anchor='nw'
)
for i in range(100):
for j in range(30):
tk.Label(inner_frm, text=f'-----{i}-----{j}-----').grid(column=i, row=j)
root.mainloop()
我尝试了几种不同的方法但没有成功。我最接近的是
root.update_idletasks()
width = root.winfo_width()
required_height = inner_frm.winfo_reqheight()
root.geometry(f"{width}x{required_height}")
但这只会调整整个窗口的大小,使框架保持相同的大小,并且窗口底部有一半是空的。
如何在垂直方向上正确调整框架本身的尺寸?
将小部件添加到
inner_frm
中不会垂直扩展画布。 当inner_frm
调整大小时,需要手动扩展画布:
def on_configure(event):
canv.configure(
scrollregion=canv.bbox('all'),
height=event.height # set height of canvas to the same as that of the frame
)
inner_frm.bind('<Configure>', on_configure)