[英]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.此
Frame
的grid
设置与任何其他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.field
的Frame
的列的大的最小宽度,您可以确保事情将按照您希望的方式对齐。 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.