Tkinter - 框架可以水平滚动,但不能正确地垂直调整自身大小

问题描述 投票:0回答:1

我有一个可水平滚动的框架。这正在按预期工作。 我希望框架能够垂直调整自身大小,以便显示所有小部件。 目前,框架不会随着添加额外的小部件而增长,并且在某个点以下创建的小部件不可见。 我知道我可以使用垂直滚动条,但我非常不愿意这样做。框架将包含可变数量的小部件,但数量绝不会多到需要在垂直方向上滚动。所以我更希望它能自然地朝那个方向调整大小。 这是一个最小的代码示例:

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}")

但这只会调整整个窗口的大小,使框架保持相同的大小,并且窗口底部有一半是空的。

如何在垂直方向上正确调整框架本身的尺寸?

python python-3.x tkinter tkinter-canvas
1个回答
0
投票

将小部件添加到

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)
© www.soinside.com 2019 - 2024. All rights reserved.