Recientemente comencé a usar tkinter en python, y tenía problemas para centrar la ventana. Intenté todos los consejos en este sitio web, pero cada vez que los pruebo, la ventana es como una línea en el medio de la pantalla. Ya tengo widgets, y funciona bien sin el centrado, pero realmente agradecería si alguien pudiera ayudarme a resolver mi problema. Esto es lo que he estado intentando hasta ahora.

root = Tk()
root.title("Password")
root.resizable(FALSE,FALSE)

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

w = mainframe.winfo_width()
h = mainframe.winfo_height()
ws = root.winfo_screenwidth()
hs = root.winfo_screenheight()
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
root.geometry('%dx%d+%d+%d' % (w, h, x, y))
3
zih301 3 sep. 2014 a las 09:25

2 respuestas

La mejor respuesta

Ok, he encontrado y solucionado el problema. Aprovechando la solución de OregonTrail, descubrí que si la ventana es del tamaño correcto y solo desea cambiar la ubicación, entonces, en lugar de configurar el tamaño de la raíz, puede mover la ventana al centro.

w = root.winfo_reqwidth()
h = root.winfo_reqheight()
ws = root.winfo_screenwidth()
hs = root.winfo_screenheight()
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
root.geometry('+%d+%d' % (x, y)) ## this part allows you to only change the location

Creo que esta respuesta no está exactamente en el centro, probablemente fuera un poco, ya que h estaba regresando 200 cuando debería ser menor, pero parece estar en el centro y funciona bien.

2
zih301 3 sep. 2014 a las 13:02

Debe usar winfo_reqwidth() y winfo_reqheight(), porque la ventana no tiene una altura o un ancho en el momento en que llama winfo_height() y winfo_width().

Un programa de ejemplo:

from tkinter import Tk
from tkinter import ttk

root = Tk()

style = ttk.Style()
style.configure("BW.TLabel", foreground="black", background="white")

l1 = ttk.Label(text="This is the best label in the world", style="BW.TLabel")
l1.pack()

w = l1.winfo_reqwidth()
h = l1.winfo_reqheight()
ws = root.winfo_screenwidth()
hs = root.winfo_screenheight()
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
print(w, h, x, y)
root.geometry('%dx%d+%d+%d' % (w, h, x, y))

root.mainloop()
2
OregonTrail 3 sep. 2014 a las 07:10