我仍然对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()
答案 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)