【问题标题】:How to line left justify label and entry boxes in Tkinter grid如何在 Tkinter 网格中对齐左对齐标签和输入框
【发布时间】:2015-09-17 09:16:57
【问题描述】:

我对 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()

【问题讨论】:

    标签: python python-2.7 tkinter


    【解决方案1】:

    我已经成功使用了 justify 和 anchor:

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

    【讨论】:

    • 请注意,我必须将 LEFT 括在引号中并使用小写 (justify="left")
    【解决方案2】:

    我认为您的问题在于每次创建LabeledFrame 的新实例时,您都将EntryLabel 放在同一个Frame 中。

    Framegrid 设置与任何其他Frame 是分开的,因此LabeledFrames 无法对齐列,因为它们的列宽值不同。

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

    无需更改太多代码即可解决此问题的最简单方法:

    您需要在for 循环中添加一行。如果您为插入self.fieldFrame 的列指定较大的最小宽度,则可以确保事情会按照您的意愿排列。我还在LabeledEntry 类中的grid 调用中添加了配置选项:sticky = W 用于Labelsticky = E 用于Entry

    试试这个,看看它是否能解决您的问题。如果您希望该列占用更少的空间,只需减少 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-07
      • 2019-02-03
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      相关资源
      最近更新 更多