如何在Tkinter网格中左对齐标签和输入框

时间:2015-06-30 14:07:43

标签: python python-2.7 tkinter

我仍然对Tkinter和Classes很新,但我试图在Tkinter网格的各自列中保留标签和输入框。我正在使用Justify=LEFT,但似乎没有影响,因为标签看起来居中,输入框从标签结束处开始。

from Tkinter import *

class LabeledEntry(Frame):
    def __init__(self, parent, *args, **kargs):
        text = kargs.pop("text")
        Frame.__init__(self, parent)
        Label(self, text=text, justify=LEFT).grid(column=0,row=0)
        Entry(self, justify=LEFT, *args, **kargs).grid(column=1, row=0)

class User_Input:
    def __init__(self, parent):
        fields = ['Text Label 1', 'This is the text Label 2']
        GUIFrame =Frame(parent)
        GUIFrame.pack(expand=True, anchor=NW)
        parent.minsize(width=350, height=325)
        field_index = 1
        for field in fields:
            self.field = LabeledEntry(GUIFrame, text=field)
            self.field.grid(column=0, row=field_index)
            field_index += 1
        self.Button2 = Button(parent, text='exit', command= parent.quit)
        self.Button2.place(x=25, y=300)

root = Tk()

MainFrame =User_Input(root)
root.mainloop()

2 个答案:

答案 0 :(得分:1)

我认为您的问题在于,每次创建LabeledFrame的新实例时,您都会放置Entry&同一Label内的Frame

grid的{​​{1}}设置与其他Frame分开,因此Frame无法对齐列,因为它们没有相同的值用于列宽。

通常情况下,只需将LabeledFrame放入sticky = W小部件的grid选项中,即可完成您所需的内容,以左对齐单元格的内容。但是,这仅适用于每个Entry个人,使每个单独的Frame的内容不对齐。

在不改变代码的情况下解决此问题的最简单方法:

您需要在LabeledFrame循环中添加一行。如果您指定插入for self.field的列的最小宽度,则可以确保事情符合您的预期。我还为Frame类中的grid次调用添加了配置选项:[{1}}& LabeledEntry sticky = W的{​​{1}}。

尝试一下,看看它是否能解决您的问题。如果您希望专栏占用更少的空间,只需减少Label

sticky = E

答案 1 :(得分:0)

我同时使用了justify和anchor:

Label(self, text=text, justify=LEFT, anchor="w").grid(sticky = W, column=0,row=0)