假设一个简单的 3 行 1 列网格,其中第二个小部件是标签,而第一个和第三个小部件是文本。
sticky
和 weight
设置肯定是正确的。网格尺寸已定义,不应由其内容决定。
问题是第一行和第三行中的文本共享空间,就好像第二行中的标签不存在一样。两个文本各占据网格高度的一半。
更奇怪的是,标签肯定是在那里。如果网格拉伸到足以超过默认文本高度(大约 24 行),您可以看到它。
我将不胜感激对这种奇怪行为的任何澄清。
我对替代方案(包?)持开放态度,这将允许我将文本-标签-文本组合在一列中,以便每一列都占用所有可用的宽度,标签占用最小的必要高度,并且文本平均共享剩余的网格高度。
我尝试过的
parent.rowconfigure(n, weight=1)
第行的n
可确保正确调整大小,而child.grid(row=r, column=c, sticky="news")
则在网格的r,c
单元格中拉伸小部件。
可悲的是,所有其他 SO 问题都围绕这些概念跳舞,这在这种情况下没有帮助。
我已经做了一个测试应用程序。如果使用
with_text=False
运行它,您可以看到网格高度按预期分布在三个标签之间。如果您随后使用 with_text=True)
运行它,您可以看到带有文本小部件的第一行和第三行都占据了网格高度的一半。如果您将应用程序垂直拉伸得足够远,则会出现带有标签 does 的第二行。
from tkinter import *
import tkinter.font as tkFont
def application(master, with_text):
for r in range(3):
master.rowconfigure(r, weight=1)
for c in range(1):
master.columnconfigure(c, weight=1)
if r == 1 and c == 0:
lbl = Label(master, text="Hello")
lbl.grid(row=r, column=c, sticky="news")
continue
if with_text:
lbl = Text(master, bd=3, relief=SUNKEN)
lbl.grid(row=r, column=c, sticky="news")
lbl.insert(END, 1000 + r + c)
else:
lbl = Label(master, text="Hi")
lbl.grid(row=r, column=c, sticky="news")
root = Tk()
root.geometry("200x100")
root.title('Text grid overflow')
mono_font = tkFont.nametofont("TkFixedFont")
mono_font.configure(size=8)
with_text=False
application(root, with_text)
root.mainloop()
with_text = False
with_text = True
with_text=True,垂直拉伸
导致问题的因素:
grid
将尝试将所有内容都放入窗口中,当它不能时,它将开始按与其重量成比例地减小每行和列中小部件的大小。事情是这样的:
grid
尝试将两个 80 字符高的小部件和一个一字符高的小部件放入窗口中。它们不适合,因为您强制窗口为 200x100 像素。
因此,它必须开始缩小每个小部件的首选尺寸以使它们适合。为此,它需要从 each 小部件中获取一个像素。如果仍然不适合,则从 each 小部件中再获取一个。经过十几次左右的尝试后,标签的高度将变为零,因此不再可见。然后,它会继续一次缩小文本小部件一个像素,直到它们适合窗口。