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. 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.
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()
We can use place() method to set the position of the Tkinter labels.
Tkinter Label widget can be aligned using the anchor attributes. In order to calculate the accommodate spacing and alignment of the widget, anchor would help in a better way. Anchor provides several options such as N, W, S, E, NW, NE. SW, SE which can be defined in the pack manager itself.
Important: pack(), place(), and grid() should not be combined in the same master window. Instead choose one and stick with it.
padx, pady − How many pixels to pad widget, horizontally and vertically, outside v's borders. row − The row to put widget in; default the first row that is still empty. rowspan − How many rowswidget occupies; default 1. sticky − What to do if the cell is larger than widget.
I have had success using both justify and anchor:
Label(self, text=text, justify=LEFT, anchor="w").grid(sticky = W, column=0,row=0)
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
.
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.
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. However, this will only work for each individual Frame
, leaving the contents of each separate LabeledFrame
out of alignment.
Easiest way to fix this without changing much code:
You'll want to add a line to your for
loop. 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. I've also added config options to the grid
calls within the LabeledEntry
class: sticky = W
for the Label
& sticky = E
for the Entry
.
Try this out and see if it solves your problem. If you would like the column to take less space simply reduce 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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With