Enrique Metner
Enrique Metner

Reputation: 189

tkinter centering two or more widgets

So I created a frame in which I want to put two widgets with them being centered on the x-axis. When it's one object pack() centers it automatically. But I can't figure out two widgets. I tried with grid() but there is free space left on the right which makes it look unsymetrical as seen in the image. enter image description here

how could I get what is seen on the right? (I'd prefer it being dont with pack() but if there is a solution with grid() and/or place() as well i'd appreciate those as well!)

here's the code for the left picture

from tkinter import *
from tkinter import font

root = Tk()
root.geometry("500x500")

frame = Frame(root, bg="white", highlightbackground="black", highlightthickness=2)
frame.place(relwidth=0.5, relheight=0.5, relx=0.5, rely=0.5, anchor=CENTER)

label = Label(frame, bg="lime", text="label", font=font.Font(size=20))
label.grid(column=0, row=0)

button = Button(frame, bg="yellow", text="pressbutton", font=font.Font(size=20))
button.grid(column=1, row=0)

root.mainloop()

Upvotes: 1

Views: 1935

Answers (2)

acw1668
acw1668

Reputation: 47193

You can put the label and button in another frame, and use pack() on that frame:

from tkinter import *
from tkinter import font

root = Tk()
root.geometry("500x500")

frame = Frame(root, bg="white", highlightbackground="black", highlightthickness=2)
frame.place(relwidth=0.5, relheight=0.5, relx=0.5, rely=0.5, anchor=CENTER)

frame2 = Frame(frame)
frame2.pack() # default side='top'

label = Label(frame2, bg="lime", text="label", font=font.Font(size=20))
label.pack(side='left', fill='both')

button = Button(frame2, bg="yellow", text="pressbutton", font=font.Font(size=20))
button.pack(side='left')

root.mainloop()

Upvotes: 1

Reblochon Masque
Reblochon Masque

Reputation: 36732

You can use frame.pack() to easily position the frame in the top, middle of its parent.

enter image description here

from tkinter import *
from tkinter import font

root = Tk()
root.geometry("500x500")

frame = Frame(root, bg="white", highlightbackground="black", highlightthickness=2)
frame.pack()

label = Label(frame, bg="lime", text="label", font=font.Font(size=20))
label.grid(column=0, row=0)

button = Button(frame, bg="yellow", text="pressbutton", font=font.Font(size=20))
button.grid(column=1, row=0)

root.mainloop()

Upvotes: 2

Related Questions