3

这是我在这个简单的 GUI 中使用的代码:

def main():

    DOCROOT_LABEL = 'Document root:'
    PORT_LABEL = 'Listen on port:'
    APPNAME = 'PIPlayD'
    TEXT_HEIGHT = 1
    MF_WIDTH = 400
    MF_HEIGHT = 150

    # Loading main window
    win = Tkinter.Tk(baseName = APPNAME)
    win.wm_title(APPNAME)

    # Setting main frame
    f = Tkinter.Frame(win, width = MF_WIDTH, height = MF_HEIGHT)
    f.pack_propagate(False)


    # Setting labels
    label_DocRoot = Tkinter.Label(f,
                                  width = len(DOCROOT_LABEL),
                                  anchor = Tkinter.W,
                                  justify = Tkinter.LEFT,
                                  text = DOCROOT_LABEL)

    label_Port = Tkinter.Label(f,
                               width = len(PORT_LABEL),
                               anchor = Tkinter.W,
                               justify = Tkinter.LEFT,
                               text = PORT_LABEL)

    # Setting text areas
    text_DR = Tkinter.Text(f, height = TEXT_HEIGHT)

    text_P = Tkinter.Text(f, height = TEXT_HEIGHT)

    f.pack()
    label_DocRoot.pack()
    text_DR.pack()
    label_Port.pack()
    text_P.pack()

    win.mainloop()

我已将其设置为将字符串的长度作为其宽度,我已将其锚属性设置为 W 并将其向左对齐(尽管据我所知, justify 不是必需的,因为它控制如何它在发生回车时对齐)。

现在,我注意到如果我更改len(DOCROOT_LABELMF_WIDTH, 以匹配框架宽度,它会正确对齐。

那么,如何对齐宽度与框架内父宽度不匹配的小部件?

4

2 回答 2

9

如果我正确理解了您的问题,您希望将标签放在框架的左侧。您的方法的问题是您仅对齐标签的文本,而不是标签本身,它们比框架小得多 - 通过设置background不同的颜色可以很容易地看到这一点。

您可以通过使用fill参数来解决此问题:label_DocRoot.pack(fill="x")。但是,我建议使用不同的布局管理器,例如更灵活的grid方法。

f.grid()
label_DocRoot.grid(row=1, column=1, sticky=Tkinter.W)
text_DR.grid(row=2, column=1, sticky=Tkinter.W)
label_Port.grid(row=3, column=1, sticky=Tkinter.W)
text_P.grid(row=4, column=1, sticky=Tkinter.W)

通过更改 和 的值rowcolumn您还可以将标签放置在同一行和文本字段的左侧,这样看起来会更好。

另请注意,Text您应该将Entry小部件用于单行文本。

于 2013-10-13T12:02:20.367 回答
0

如果您希望继续将标签打包到画布中,还有另一种选择。尝试通过在 pack() 中设置锚点来锚定标签,而不是锚定标签内的文本。

label_DocRoot.pack(anchor = Tkinter.W)
label_Port.pack(anchor = Tkinter.W)
于 2017-03-12T23:08:39.130 回答