Tkinter - Gestión de geometría

Resuelto Thingamabobs asked hace 4 años • 1 respuestas

Veo y vi muchas preguntas para tkinter que a menudo no se refieren a errores en su código, sino a cómo organizo mi GUI. Entonces me gustaría tener una respuesta que se centre en eso y ayude a los principiantes a orientarse un poco.

Thingamabobs avatar Aug 22 '20 20:08 Thingamabobs
Aceptado

Conocimientos básicos sobre la gestión de geometría de tkinters.

La gestión de la geometría de tkinter se caracteriza por esta cita aquí :

Por defecto aparece en pantalla una ventana de nivel superior en su tamaño natural, que es el que determinan internamente sus widgets y gestores de geometría.


Niveles superiores

Tu nivel superior es la primera pregunta que debes responder:

  • wm_geometry : ¿tamaño, posición en tu pantalla?
  • wm_minsize \ wm_maxsize ¿hay límites mínimos o máximos?
  • ¿ wm_resizable tiene el usuario la capacidad de cambiar su tamaño?
  • wm_attributes ¿hay atributos como superior o pantalla completa?
  • pack_propagate \ grid_propagate ignora el ancho y alto solicitados de los niños.

Nota: Puede omitir esta pregunta y dejar que el proceso decida qué se necesitará después de todo.


Organizar a los niños

Para organizar a tus hijos tienes 3 opciones, cada una de ellas está diseñada para satisfacer necesidades específicas:

El empacador :

El comando pack se utiliza para comunicarse con el empaquetador, un administrador de geometría que organiza los hijos de un padre empaquetándolos en orden alrededor de los bordes del padre.

-> Utilizo pack para organizar rápidamente algunos widgets uno al lado del otro en el maestro.

el placer

El placer es un administrador de geometría para Tk. Proporciona una ubicación fija simple de ventanas, donde usted especifica el tamaño exacto y la ubicación de una ventana, llamada esclava, dentro de otra ventana, llamada maestra. El colocador también proporciona colocación de lámina de goma, donde usted especifica el tamaño y la ubicación del esclavo en términos de las dimensiones del maestro, de modo que el esclavo cambie de tamaño y ubicación en respuesta a los cambios en el tamaño del maestro. Por último, el colocador le permite mezclar estos estilos de ubicación para que, por ejemplo, el esclavo tenga un ancho y alto fijos pero esté centrado dentro del maestro.

-> A veces uso lugar para aplicaciones de One-Sheet o para configurar una imagen de fondo.

la grilla

El comando de cuadrícula se utiliza para comunicarse con el administrador de geometría de cuadrícula que organiza los widgets en filas y columnas dentro de otra ventana, llamada maestra de geometría (o ventana maestra).

-> Grid es la mejor opción para aplicaciones más complejas que contienen muchos widgets.

Entonces, la pregunta que debes responder aquí, antes de elegir a uno de estos gerentes, es: ¿cómo organizo mi solicitud de la mejor manera?

Nota :

Advertencia: Nunca mezcle rejilla y paquete en la misma ventana maestra. Tkinter pasará felizmente el resto de su vida intentando negociar una solución con la que ambos gerentes estén contentos. En lugar de esperar, cierre la aplicación y eche otro vistazo a su código. Un error común es utilizar el padre incorrecto para algunos de los widgets.

-> Puedes crear un diseño anidado, en cada maestro (ventana/marco) tienes libertad de elección


Características más importantes

Las características más importantes de cada pesebre pueden ayudar a responder a tu pregunta. Porque necesitarás saber si el gerente puede hacer lo que tú quieres hacer.

Para el paquete creo que es:

  1. llenar estirar el esclavo horizontal, vertical o ambos
  2. expandir Los esclavos deben expandirse para consumir espacio adicional en su maestro.
  3. lado Especifica en qué lado del maestro se empaquetarán los esclavos.
  4. Anchor especifica dónde colocar cada esclavo en su paquete.

Por lugar debería ser:

  1. relheight -relheight=1.0, -height=-2 hace que el esclavo sea 2 píxeles más corto que el maestro.
  2. relwidth -relwidth=1.0, -width=5 hace que el esclavo sea 5 píxeles más ancho que el maestro.
  3. relx -relx=0.5, -x=-2 coloca el borde izquierdo del esclavo 2 píxeles a la izquierda del centro.
  4. confiar -rely=0.5, -x=3 posiciona el borde superior del esclavo 3 píxeles debajo del centro de su maestro.

Y para grid debería ser:

  1. columnspan Inserta el esclavo de modo que ocupe n columnas en la cuadrícula.
  2. rowspan Inserta el esclavo de modo que ocupe n filas en la cuadrícula.
  3. Sticky esta opción se puede utilizar para posicionar (o estirar) el esclavo dentro de su celda.
  4. grid_remove se recuerdan las opciones de configuración para esa ventana
  5. grid_columnconfigure
  6. grid_rowconfigure

para las dos últimas opciones recomiendo esta respuesta aquí .


Lea los documentos

Puede encontrar un ejemplo funcional para jugar aquí:

ingrese la descripción de la imagen aquí

import tkinter as tk

root=tk.Tk()

holderframe = tk.Frame(root,bg='red')
holderframe.pack()

display = tk.Frame(holderframe, width=600, height=25,bg='green')
display2 = tk.Frame(holderframe, width=300, height=145,bg='orange')
display3 = tk.Frame(holderframe, width=300, height=300,bg='black')
display4 = tk.Frame(holderframe, width=300, height=20,bg='yellow')
display5 = tk.Frame(holderframe, bg='purple')


##display_green
display.grid(column = 0, row = 0, columnspan=3)
display.pack_propagate(0) #when using pack inside of the display
#display.grid_propagate(0) #when using grid inside of the display

#left
b =tk.Button(display, width =10,text='b')
b1 =tk.Button(display, width =10,text='b1')

b.pack(side='left')
b1.pack(side='left')
#right
b2 =tk.Button(display, width =20,text='b2')
b2.pack(side='right')
#center
l = tk.Label(display, text ='My_Layout',bg='grey')
l.pack(fill='both',expand=1)

#the order by using pack can be important.
#you will notice if you swip right with center.


##display2_orange
display2.grid(column=0,row=1, sticky='n')
display2.grid_propagate(0)

#column0
lab = tk.Label(display2, text='test2')
lab1 = tk.Label(display2, text='test2')
lab2 = tk.Label(display2, text='test2')
lab3 = tk.Label(display2, text='test2')
lab4 = tk.Label(display2, text='test2')
lab5 = tk.Label(display2, text='test2')
lab6 = tk.Label(display2, text='test2')

lab.grid(column=0,row=0)
lab1.grid(column=0,row=1)
lab2.grid(column=0,row=2)
lab3.grid(column=0,row=3)
lab4.grid(column=0,row=4)
lab5.grid(column=0,row=5)
lab6.grid(column=0,row=6)

#column1
lab10 = tk.Label(display2, text='test2')
lab11 = tk.Label(display2, text='test2')
lab12 = tk.Label(display2, text='test2')
lab13 = tk.Label(display2, text='test2')
lab14 = tk.Label(display2, text='test2')
lab15 = tk.Label(display2, text='test2')
lab16 = tk.Label(display2, text='test2')

lab10.grid(column=2,row=0)
lab11.grid(column=2,row=1)
lab12.grid(column=2,row=2)
lab13.grid(column=2,row=3)
lab14.grid(column=2,row=4)
lab15.grid(column=2,row=5)
lab16.grid(column=2,row=6)

display2.grid_columnconfigure(1, weight=1)
#the empty column gets the space for left and right effect

##display3_black
display3.grid(column=1,row=1,sticky='nswe')
display3.grid_propagate(0)

##display4_yellow
display4.grid(column=0,row=1,sticky='s')
display4.grid_propagate(0)

lab20 = tk.Label(display4, bg='black')
lab21 = tk.Label(display4, bg='red')
lab22 = tk.Label(display4, bg='orange')
lab23 = tk.Label(display4, bg='grey')

lab20.grid(column=0,row=0,sticky='ew')
lab21.grid(column=1,row=0,stick='e')
lab22.grid(column=2,row=0,sticky='e')
lab23.grid(column=3,row=0,stick='ew')

display4.grid_columnconfigure(0, weight=4)
display4.grid_columnconfigure(1, weight=2)
display4.grid_columnconfigure(2, weight=2)
display4.grid_columnconfigure(3, weight=1)

##display5_purple
display5.place(x=0,y=170,relwidth=0.5,height=20)
display5.grid_propagate(0)


root.mainloop()
Thingamabobs avatar Aug 22 '2020 13:08 Thingamabobs