Tkinter 文本小部件在网格管理器内意外溢出

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

假设一个简单的 3 行 1 列网格,其中第二个小部件是标签,而第一个和第三个小部件是文本。

sticky
weight
设置肯定是正确的。网格尺寸已定义,不应由其内容决定。

问题是第一行和第三行中的文本共享空间,就好像第二行中的标签不存在一样。两个文本各占据网格高度的一半。

更奇怪的是,标签肯定是在那里。如果网格拉伸到足以超过默认文本高度(大约 24 行),您可以看到它。

我将不胜感激对这种奇怪行为的任何澄清。

我对替代方案(包?)持开放态度,这将允许我将文本-标签-文本组合在一列中,以便每一列都占用所有可用的宽度,标签占用最小的必要高度,并且文本平均共享剩余的网格高度。

我尝试过的

有关网格管理器的文档(12)显示,

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

a 200by100 window, with three rows, each being a Label

with_text = True

a 200by100 window with apparently two rows, each being a Text. The third row in the middle, which is a Label, is not visible

with_text=True,垂直拉伸

a 200by750 window with three rows: 1st and 3rd are Texts, 2nd is a Label. Grid height accommodated all 24 lines for both Texts, and only then the Label became visible

python tkinter grid-layout tkinter-layout tkinter-text
1个回答
0
投票

导致问题的因素:

  • 您没有指定文本小部件的宽度或高度,因此它将默认为 80x24 字符宽/高。
  • 您强制窗口采用特定尺寸,该尺寸太小而无法按照其要求的尺寸容纳所有内容。
  • grid
    将尝试将所有内容都放入窗口中,当它不能时,它将开始按与其重量成比例地减小每行和列中小部件的大小。
  • 所有行的权重都相同

事情是这样的:

grid
尝试将两个 80 字符高的小部件和一个一字符高的小部件放入窗口中。它们不适合,因为您强制窗口为 200x100 像素。

因此,它必须开始缩小每个小部件的首选尺寸以使它们适合。为此,它需要从 each 小部件中获取一个像素。如果仍然不适合,则从 each 小部件中再获取一个。经过十几次左右的尝试后,标签的高度将变为零,因此不再可见。然后,它会继续一次缩小文本小部件一个像素,直到它们适合窗口。

© www.soinside.com 2019 - 2024. All rights reserved.