【发布时间】:2014-01-27 08:31:31
【问题描述】:
在下文中,标记为“ONE”、“TWO”和“THR”的按钮的间距不均匀。在我看来,问题的根源在于 Tk 假设任何包含跨越多列的小部件的一部分的列的默认最小宽度。但是,这种行为似乎没有记录,所以我不确定如何适应或调整它以使列具有相等的宽度 - 包括文本小部件跨越的两列和文本不跨越的单列小部件 - 从而均匀地隔开按钮。我可以通过反复试验来解决它,即填充后一列直到它与前两列匹配,但这似乎是一个糟糕的解决方案。
编辑: 在下面与@jwillis0720 的讨论之后,我添加了一个额外的列 (3) 和按钮 ('FIV') 以使问题更清晰。这个问题是关于如何在其中一些列由多列小部件跨越而其他列不跨越时获得相同宽度的列。
import Tkinter
master = Tkinter.Tk()
Tkinter.Button(master, text='ONE').grid(row=0, column=0)
Tkinter.Button(master, text='TWO').grid(row=0, column=1)
Tkinter.Button(master, text='THR').grid(row=0, column=2)
Tkinter.Button(master, text='FOU').grid(row=1, column=2)
Tkinter.Button(master, text='FIV').grid(row=0, column=3) # added as per above edit
Tkinter.Text(master).grid(row=1, column=0, columnspan=2)
master.mainloop()
请注意,将grid_columnconfigure 与uniform 一起使用并不能解决此问题。插入以下行(参见此处类似问题的答案:How to create equal-width columns in Python 2.7 with Tkinter)只会使列具有弹性;它们的大小仍然不均匀:
master.grid_columnconfigure(0, weight=1, uniform='a')
master.grid_columnconfigure(1, weight=1, uniform='a')
master.grid_columnconfigure(2, weight=1, uniform='a')
master.grid_columnconfigure(3, weight=1, uniform='a') # added as per above edit
【问题讨论】:
-
除了我的回答之外,我知道一开始这似乎很麻烦,但是如果您继续使用 tkinter 构建复杂的 gui 应用程序,请考虑将内容放入类中并嵌入大量框架。例如,我会通过将这些按钮变成框架然后为它们着色来“观察”tkinter 布置了多少几何图形。然后我会把按钮放在框架内。
-
@jwillis0720 并没有你想象的那么有帮助;强制使用相等的 visual 列宽而不将所有内容保持在具有 actual 统一组的单个网格中确实很难。这就是为什么我们首先添加制服组……
-
@jwillis0720 感谢您提供有关彩色框架的提示 - 我将对此进行试验。不过,为了这个问题,我很想了解一般问题,即
columnspan与 Tkinter 的网格布局算法中的列宽相关的方式,以及如何在没有试验的情况下改变或补偿这种情况和尝试不同布局参数的错误过程。 -
@Westcroft_to_Apse 看起来只是因为文本小部件比按钮小部件占用了更多空间。因此,它将它们所在的网格推向右侧并使其看起来被压扁。我认为这只是网格管理器的结果。
-
例如,看看如果你只是用另一个按钮小部件替换 txt 框会发生什么。一切都很酷。
标签: python python-2.7 tkinter tcl tk