【问题标题】:Aligning widgets using grid between multiple Tkinter LabelFrames在多个 Tkinter LabelFrames 之间使用网格对齐小部件
【发布时间】:2012-03-18 15:24:56
【问题描述】:

我正在尝试创建一个 Tkinter 布局,它的标签和输入字段在多个 LabelFrame 框中垂直对齐。

下面是一些简化的代码:

#!/usr/bin/python
from Tkinter import *

win = Frame()
win.grid(sticky=N+S+E+W)

frame_a = LabelFrame(win, text='Top frame', padx=5, pady=5)
frame_b = LabelFrame(win, text='Bottom frame', padx=5, pady=5)
frame_a.grid(sticky=E+W)
frame_b.grid(sticky=E+W)

for frame in frame_a, frame_b:
    for col in 0, 1, 2:
        frame.columnconfigure(col, weight=1)

Label(win, text='Hi').grid(in_=frame_a, sticky=W)
Label(win, text='Longer label, shorter box').grid(in_=frame_b, sticky=W)

Entry(win).grid(in_=frame_a, row=0, column=1, sticky=W)
Entry(win, width=5).grid(in_=frame_b, row=0, column=1, sticky=W)

win.mainloop()

上面的代码生成一个如下所示的窗口:

而我正在寻找一些对齐字段的方法,使窗口看起来更像这样(感谢 MS Paint):

我已经尝试过 in_grid() 的参数,但没有取得很大的成就,我想不出还有什么可以尝试的。

【问题讨论】:

    标签: python user-interface tkinter


    【解决方案1】:

    简短的回答是:你不能做你想做的事。 grid 不跨多个容器管理其行和列。

    但是,至少有几种方法可以实现您想要的效果。一种方法是给每个容器中的第一列一个明确的、相同的宽度。为此,您可以使用grid_columnconfigure 方法为每列指定最小宽度。

    另一种解决方案是给每个标签一个相同的宽度,这将有效地将第一列的宽度设置为相同(假设每个容器中的所有列具有相同的权重)。

    【讨论】:

    • 有没有办法计算出所有给定标签集的最大宽度是多少?我更喜欢编写不需要硬编码特定宽度的代码,我不需要,所以如果可能的话,我想让代码计算正确的宽度来使用。
    • @me_and:嗯,你知道(或者可以简单地计算)标签的宽度,对吧?只需将所有标签设置为等于最宽标签的宽度。或者,您可以使用字体命令以像素为单位准确计算字符串的宽度并使用它。您也可以在小部件上使用winfo_width 来获取它的宽度,尽管在小部件实际显示在屏幕上之前通常会报告 1x1。如果您想要该问题的正确答案,请将其作为一个单独的问题提出 - cmets 不适合提供更好的答案。
    【解决方案2】:

    我知道做你想做的最简单的方法是更改​​标签文本变量,然后检查 len(txt1) 和 len(txt2),并将两者的宽度变量设置为最长一。以下代码很接近。我的知识太有限,无法弄清楚额外空间是从哪里来的。

        txt1 = StringVar()
        txt2 = StringVar()
        lblWidth = IntVar()
        txt1 = "Hi"
        txt2 = "Longer label, shorter box"
    
        if (len(txt1) > len(txt2)):
            lblWidth = len(txt1)
        else:
            lblWidth = len(txt2)
    
        Label(win, text=txt1, width=lblWidth, anchor=W).grid(in_=frame_a)
        Label(win, text=txt2, width=lblWidth, anchor=W).grid(in_=frame_b, sticky=W)
    

    【讨论】:

    • 我没有运行你的代码,但我认为除非你使用 Mono 字体,否则它不起作用。我的意思是,OOOOO 的长度与 IIIIII 相同,但第二个会小得多(在大多数字体中)。此外,在您的示例中,您正在设置宽度=25。请注意,25 个字符!= 25 像素;)
    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多