python python-3.x tkinter

python - Encuentra la posición de otro anclaje que el ancla ya usado



python-3.x tkinter (1)

grid() y pack() son "precisos" suficientes para la mayoría de las necesidades. Solo tiene que aprender a usar correctamente estos administradores de geometría al máximo. De hecho, el uso de place() casi nunca es lo que necesitas. Tiene sus usos de caja, pero no es una gran opción para configuraciones generales de GUI. También es muy difícil de administrar para actualizar su código.

Actualización: Para responder a su pregunta en los comentarios:

¿Configurar fila significa que pones cada fila a 1 píxel debido al peso? Sé que puedo dibujar una cuadrícula sobre todo, pero no sé cuántas filas y columnas tiene mi programa. por lo tanto no puedo encontrar el centro.

Los pesos se utilizan para indicar a una fila o columna específica que debe redimensionarse a una cierta proporción en relación con las otras filas y columnas que se encuentran dentro de la misma cuadrícula / contenedor. El peso predeterminado es cero. Cuando establecemos el peso en 1, entonces esa fila o columna cambiará de tamaño con la ventana a una velocidad uniforme.

Toma este código de ejemplo:

import tkinter as tk root=tk.Tk() center_frame = tk.Frame(root) center_frame.grid(row=1, column=1, sticky="nsew") tk.Label(center_frame, text="Name/ID").grid(row=0, column=0) tk.Label(center_frame, text="Password").grid(row=1, column=0) tk.Button(center_frame, text="Enter").grid(row=2, column=1) root.mainloop()

Resultados:

En el ejemplo anterior, verá que los widgets no se mueven cuando cambia el tamaño de la ventana. Esto se debe a que no hemos dado instrucciones a tkinter para permitir que se muevan las filas o columnas.

Si agregamos este peso al programa root.rowconfigure(0, weight=1) :

Entonces obtenemos este efecto:

A continuación, agregue este root.rowconfigure(2, weight=1) :

A continuación, agregue este root.columnconfigure(0, weight=1) :

A continuación, agregue este root.columnconfigure(2, weight=1) :

Como puede ver con las imágenes anteriores, dependiendo de las filas y columnas a las que haya asignado un peso, las filas y columnas se redimensionarán en consecuencia. Lo que logramos con el código anterior es tener que cambiar el tamaño de las filas 0 y 2 y cambiar el tamaño de las columnas 0 y 2. row 1 column 1 no cambiará de tamaño. Así que eso significa que cualquier cosa que coloquemos en la row 1 column 1 posición de la row 1 column 1 no cambiará de tamaño, sino que mantendrá su ubicación relativa a los bordes. Debido a que establecimos un widget de cuadro en la row 1 column 1 posición row 1 column 1 , y luego todos nuestros widgets dentro del cuadro hemos hecho efectivamente que la row 1 column 1 el centro.

Hay tantas filas y columnas como le digas que tenga. Tkinter ajustará automáticamente el total de filas y columnas en función de lo que diga. Además, también hará que las filas y columnas sin nada en ellas tengan un tamaño cero. Eso significa que solo las filas y columnas con contenido (widgets) afectarán el tamaño de la cuadrícula.

Digamos que tenemos 3 filas y 3 columnas. Dependiendo de cómo lo llenemos, cambiará el tamaño de lo que se muestra.

En este ejemplo, en cualquier lugar que vea una X , mostramos algo en las siguientes filas y columnas.

En este ejemplo tenemos algo en (0,0), (1,1) y (2,2).

ROW 0 1 2 *-------*-------*-------* | | | | 0 | X | | | C | | | | O *-------*-------*-------* L | | | | U 1 | | X | | M | | | | N *-------*-------*-------* | | | | 2 | | | X | | | | | *-------*-------*-------*

En este ejemplo tenemos algo en (0,0) y (2,2).

0 2 *-------*-------* | | | 0 | X | | | | | *-------*-------* | | | 2 | | X | | | | *-------*-------*

En este ejemplo tenemos algo en (1,0), (2,1) y (2,2).

0 1 2 *-------*-------*-------* | | | | 1 | X | | | | | | | *-------*-------*-------* | | | | 2 | | X | X | | | | | *-------*-------*-------*

Los ejemplos anteriores ilustran lo que se muestra automáticamente según la fila y la cuadrícula que llena con los widgets.

En cuanto a los argumentos como sticky estos se utilizan para gestionar el comportamiento de cada widget. Por ejemplo, si le decimos a un widget que llene todo el espacio en una fila / columna sticky="nsew" . Si queremos que un widget se extienda en una fila / columna determinada horizontalmente pero no verticalmente, sticky="ew" para este / oeste. Tenga en cuenta que el argumento pegajoso es para grid() . El administrador de geometría pack() tiene sus propios argumentos.

Hay muchas opciones y puedes encontrar una lista de ellas aquí con sus descripciones:

Para grid()

Para el pack()

Tomemos el siguiente ejemplo. Este código configurará las etiquetas y el porcentaje de botones de la ventana en todo momento, incluso cuando cambie el tamaño de la ventana. Esto es mucho más fácil de manejar que el lugar.

Hay muchos argumentos útiles que puede usar en sus administradores de geometría para lograr casi cualquier comportamiento o alineación que desee. Sólo tómate el tiempo para profundizar en él. Sé que place() siente como la mejor opción (pensé lo mismo cuando comencé antes de que Bryan corrigiera esa idea: D) pero realmente no lo es.

import tkinter as tk root=tk.Tk() root.rowconfigure(0, weight=1) root.rowconfigure(2, weight=1) root.columnconfigure(0, weight=1) root.columnconfigure(2, weight=1) center_frame = tk.Frame(root) center_frame.grid(row=1, column=1, sticky="nsew") tk.Label(center_frame, text="Name/ID").grid(row=0, column=0) tk.Label(center_frame, text="Password").grid(row=1, column=0) tk.Button(center_frame, text="Enter").grid(row=2, column=1) root.mainloop()

Aquí hay un ejemplo usando pack() . Creo que grid() es mi destino, pero pack() se puede usar para lograr mucho.

import tkinter as tk root=tk.Tk() center_frame = tk.Frame(root) center_frame.pack(expand=True) tk.Label(center_frame, text="Name/ID").pack(side=tk.TOP) tk.Label(center_frame, text="Password").pack(side=tk.TOP) tk.Button(center_frame, text="Enter").pack(side=tk.RIGHT) root.mainloop()

He creado un código para mostrar mi problema. Se parece a esto:

userNameID = tkinter.Label(root, text="Name/ID") userNameID.place(x=640, y=320, anchor="e") userNameID = tkinter.Label(root, text="Password") userNameID.place(x=640, y=360, anchor="e") entButton = tkinter.Button(root, text="Enter", command=enterPrint) entButton.place(x=640, y=400, anchor="w")

La cosa es que he alineado algún texto en un tamaño del centro y un botón en el otro lado. Quiero saber la posición del ancla noroeste para los textos para asegurarme de que todo esté a la misma distancia del centro y que aún esté alineado.