简体   繁体   English

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

[英]How to line left justify label and entry boxes in Tkinter grid

I'm still pretty new to Tkinter and Classes, but I am trying to left justify labels and entry boxes each within their own column of a Tkinter grid.我对 Tkinter 和类仍然很陌生,但我试图在 Tkinter 网格的各自列中左对齐标签和输入框。 I am using Justify=LEFT , but it seems to have no impact as the labels look centered and the entry boxes start where the label ends.我正在使用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()

I think your problem lies in the fact that each time you create a new instance of LabeledFrame , you are placing both the Entry & Label within the same Frame .我认为您的问题在于每次创建LabeledFrame的新实例时,您都将Entry & Label放在同一个Frame

The grid settings for this Frame are separate from any other Frame , so it is impossible for LabeledFrame s to align columns as they do not have the same values for column widths.Framegrid设置与任何其他Frame分开,因此LabeledFrame不可能对齐列,因为它们的列宽值不同。

Normally to accomplish what you are after you would simply put sticky = W in the grid options for the Entry widget to left-justify the contents of the cell.通常,为了完成您的任务,您只需将sticky = W放在Entry小部件的grid选项中以左对齐单元格的内容。 However, this will only work for each individual Frame , leaving the contents of each separate LabeledFrame out of alignment.但是,这仅适用于每个单独的Frame ,使每个单独的LabeledFrame的内容不对齐。

Easiest way to fix this without changing much code:无需更改太多代码即可解决此问题的最简单方法:

You'll want to add a line to your for loop.您需要在for循环中添加一行。 If you specify a large minimum-width of the column that self.field 's Frame is inserted into, you can be sure that things will align how you want them to.如果您指定插入self.fieldFrame的列的大的最小宽度,您可以确保事情将按照您希望的方式对齐。 I've also added config options to the grid calls within the LabeledEntry class: sticky = W for the Label & sticky = E for the Entry .我还在LabeledEntry类中的grid调用中添加了配置选项: sticky = W用于Label & sticky = E用于Entry

Try this out and see if it solves your problem.试试这个,看看它是否能解决你的问题。 If you would like the column to take less space simply reduce minsize .如果您希望列占用更少的空间,只需减少minsize

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(sticky = W, column=0,row=0)
        Entry(self, *args, **kargs).grid(sticky = E, 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)
            self.field.grid_columnconfigure(index = 0, minsize = 150)
            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()

我使用 justify 和 anchor 都取得了成功:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM