tkinter.Text小部件超出网格管理器约束

时间:2018-05-25 18:44:51

标签: python python-3.x tkinter

TL; DR:

文本窗口小部件比grid()调用的指定列,行组合扩展得更远。只有解决方案才会将.width.height属性更改为小型,并强制使用'nsew'扩展和填充调用的粘性标记。

背景

Text小部件给我带来了一些困惑,例如以下内容:

root = Tk()
root.geometry('400x400')
root.grid_columnconfigure(0, weight = 1)
root.grid_columnconfigure(1, weight = 1)
root.grid_rowconfigure(0, weight = 1)
root.grid_rowconfigure(1, weight = 1)
b = Button(root)
b.grid(column = 0, row = 0, sticky = 'nsew')
t = Text(root)
t.grid(column = 1, row = 1, sticky = 'nsew')

鉴于此,我应该有一个400x400的窗口,如:

+-------+-------+
|       |       |
|   b   |       |
|       |       |
+-------+-------+
|       |       |
|       |   t   |
|       |       |
+-------+-------+

但最终发生的事情是Text小部件远远超出了右下方的行:

+---+-----------+
| b |           |
+---+           |
|   |     t     |
|   |           |
|   |           |
|   |           |
+---+-----------+

解决此问题的唯一方法是改变Text小部件,如下所示:

t = Text(root, height = 1, width = 1)

然后粘滞调用将窗口小部件扩展为仅适合网格的列,行。然而,这似乎是我不应该采取的额外步骤,即使Text小部件默认为.width.height,就像所有其他小部件一样。

问题: 为什么“文本”窗口小部件会扩展到指定的列,即网格行?

1 个答案:

答案 0 :(得分:1)

  

问题:为什么“文本”窗口小部件会扩展到指定的列,即网格行?

没有;反过来说:行和列扩展以适应文本小部件。这不是文本小部件所特有的。 Tkinter将尝试安排事情,以便在可能的情况下,任何小部件将以其请求的大小显示。对于文本小部件,默认大小为80个字符乘24个字符,因此您的行和列会展开以尝试适合该小部件。

如果您在第三列和第三行中添加内容,则可以相当容易地看到这一点。您会看到第二行非常高,第二列非常宽。即:行和列展开以适合文本小部件,而不是文本小部件越过行和列的边缘。

将以下内容添加到示例代码中:

bottom_edge = Frame(root, background="red", height=4)
right_edge = Frame(root, background="red", width=4)
bottom_edge.grid(row=2, column=0, columnspan=3, sticky="ew")
right_edge.grid(row=0, column=2, rowspan=3, sticky="ns")

你必须调整窗口的大小,因为你使窗口太小而无法容纳所有东西。完成后,您将在右侧和下方看到一个红色边框,表示它是正在展开的行和列,而不是扩展到行和列之外的文本小部件。文本小部件位于第二行第二列的范围内。

enter image description here