4

考虑以下python脚本

#!/usr/bin/env python
from Tkinter import Tk, Label

width = SOME_VALUE_HERE

root = Tk()
label1 = Label(root, text='1 columns wide')
label2 = Label(root, text='%i columns wide' % width)

label1.grid()
label2.grid(row=0,column=1,columnspan=width)

root.mainloop()

当我运行它时,无论为“SOME_VALUE_HERE”设置什么值,无论是否调用了 Grid.columnconfigure 或在 grid() 中使用了sticky 参数,两个标签都占据了窗口的一半。

除非我忽略了某些东西,否则我会认为设置列跨度会强制第二个标签的宽度是第一个标签的“SOME_VALUE_HERE”倍。

我是否误解了网格的工作原理?我将如何实现这种行为?

4

3 回答 3

6

默认情况下,空网格列的宽度为零,因此您描述了下表。默认情况下,网格几何管理器会尝试优化应用程序使用的屏幕空间。它将整合所有约束并产生最合适的布局。

+---------------+---------------++++
|       0       |       1       |||| <-- 2,3,4 empty, 0 width
+---------------+---------------++++
| 1 column wide | 4 column wide    |
+---------------+---------------++++

uniform要提供严格的比例列宽,您必须使用columnconfigure. uniform采用任意值来指定共享这些比例的列组,并且该weight参数用于正确处理小部件调整大小。

label1.grid(row=0, column=0)
label2.grid(row=0,column=1, columnspan=width)
for i in range(width+1):
    root.grid_columnconfigure(i, weight=1, uniform="foo")

请注意,仅使用这两个标签,您可以通过调整第 1 列的宽度来实现相同的布局。当您填充第 2、3、4 列时,仍然会出现差异...

label2.grid(row=0,column=1) #no columnspan
root.grid_columnconfigure(0, weight=1, uniform="foo")
root.grid_columnconfigure(1, weight=width, uniform="foo")
于 2014-04-26T10:28:57.440 回答
3

当您在第 1 列中放入具有两个(或更多)列跨度的内容时,这意味着它将位于第 1 列和第 2 列(等等)。但是,如果没有任何东西可以控制列的宽度,那么该列的宽度将为零。您需要通过在其中放置一些东西,给它一个最小尺寸或强制统一列来强制第 2 列具有宽度。

当我查看您的代码时,我无法猜测您认为第 2 列应该有多宽,计算机也不能。

于 2014-04-25T23:44:06.740 回答
1

我有一个类似的问题只是发现元素受到最宽的小部件的限制。我们可以肯定地说,Tkinter 被配置为使您的应用程序统一,因为它应该是一个规则的重复方形/三角形结构。覆盖默认选项的解决方案。

  1. 考虑到 Tkinter 的自动优化,使用最大小部件(网格框)的宽度和高度,并按比例将其他框与它相关联。
  2. 使用上述方法columnspan调整宽度。
  3. 通过使用配置宽度columnconfigure()
于 2016-12-02T04:24:27.147 回答