Cómo hacer columnas Tkinter de igual ancho cuando los widgets abarcan varias columnas (Python 2.7)

A continuación, los botones etiquetados ‘UNO’, ‘DOS’ y ‘THR’ no se separan uniformemente. Me parece que la raíz del problema es que Tk está asumiendo un ancho mínimo predeterminado para cualquier columna que contenga parte de un widget que abarque varias columnas. Sin embargo, este comportamiento parece no estar documentado, por lo que no estoy seguro de cómo adaptarlo o ajustarlo para que las columnas tengan el mismo ancho, incluidas las dos columnas abarcadas por el widget de texto y la única columna no abarcada por el texto. Widget – y por lo tanto espaciar los botones uniformemente. Podría guardarlo por prueba y error, es decir, rellenar la última columna hasta que coincida con las dos anteriores, pero eso parece una mala solución.

EDITAR: Siguiendo la discusión a continuación con @ jwillis0720, he agregado una columna adicional (3) y un botón (‘FIV’) para aclarar el problema. Esta pregunta es sobre cómo obtener columnas del mismo ancho cuando algunas de esas columnas están ocupadas por widgets de varias columnas y otras no.

import Tkinter master = Tkinter.Tk() Tkinter.Button(master, text='ONE').grid(row=0, column=0) Tkinter.Button(master, text='TWO').grid(row=0, column=1) Tkinter.Button(master, text='THR').grid(row=0, column=2) Tkinter.Button(master, text='FOU').grid(row=1, column=2) Tkinter.Button(master, text='FIV').grid(row=0, column=3) # added as per above edit Tkinter.Text(master).grid(row=1, column=0, columnspan=2) master.mainloop() 

Tenga en cuenta que el uso de grid_columnconfigure con uniform no resuelve este problema. Insertando las siguientes líneas (vea la respuesta a la pregunta similar aquí: Cómo crear columnas de igual ancho en Python 2.7 con Tkinter ) simplemente hace que las columnas sean elásticas; permanecen de tamaño desigual:

 master.grid_columnconfigure(0, weight=1, uniform='a') master.grid_columnconfigure(1, weight=1, uniform='a') master.grid_columnconfigure(2, weight=1, uniform='a') master.grid_columnconfigure(3, weight=1, uniform='a') # added as per above edit 

Creo que es posible que desee utilizar la opción adhesiva.

sticky = Define cómo expandir el widget si la celda resultante es más grande que el widget en sí. Esta puede ser cualquier combinación de las constantes S, N, E y W, o NW, NE, SW y SE.

Por ejemplo, W (oeste) significa que el widget debe estar alineado con el borde de la celda izquierda. W + E significa que el widget debe estirarse horizontalmente para llenar toda la celda. W + E + N + S significa que el widget debe expandirse en ambas direcciones. Por defecto es centrar el widget en la celda.

 import Tkinter master = Tkinter.Tk() Tkinter.Button(master, text='ONE').grid(row=0, column=0, sticky='NW') Tkinter.Button(master, text='TWO').grid(row=0, column=1, sticky='NW') Tkinter.Button(master, text='THR').grid(row=0, column=2, sticky='NW') Tkinter.Button(master, text='FOU').grid(row=1, column=2) Tkinter.Text(master).grid(row=1, column=0, columnspan=2) master.mainloop() 

Editar

Cómo se ve. El mío se ve así espaciado uniformemente, excepto que el widget de texto ocupa dos columnas como se especifica.

Se parece a esto

Ya sé, pero también me costó conseguir las columnas y filas para mantener un ancho / alto común, así que pensé en compartir mi solución

Novedad en Python y Tkinter, así que si hay algún error por favor hágamelo saber.

Creé un administrador de cuadrícula, esto permitió que la ventana principal y cualquier marco se configuraran con columnas y filas espaciadas uniformemente, no es 100%, pero para lo que lo estaba usando funcionó bien, fue especialmente útil durante la fase de construcción.

un inconveniente cuando se crea un marco es que el número máximo de filas / columnas del cuadro debe ser igual o menor que el número o filas / columnas que abarca, de lo contrario, es un poco extraño (por supuesto)

espero que esto ayude

 import tkinter class grid_manager: def __init__(self, Frame, colour = "gray94"): self.Frame = Frame self.Colour = colour def set_grid(self, numofRows, numofColumns, borderwidth = 1): self.numofRows = numofRows self.numofColumns = numofColumns self.borderwidth = borderwidth for i in range(numofRows): for j in range(numofColumns): canvas = tkinter.Canvas(self.Frame) canvas.config(relief="raised", borderwidth=self.borderwidth) #comment out to hide grid layout canvas.grid(row=i, column=j) canvas.config(background=self.Colour) self.Frame.columnconfigure(j, weight=1) self.Frame.rowconfigure(i, weight=1) mainwindow = tkinter.Tk() mainwindow.title("Test") mainwindow.geometry("640x480-8-200") mainGrid = grid_manager(mainwindow) mainGrid.set_grid(10, 10) header_Frame = tkinter.Frame(mainwindow) header_Frame.grid(row=0, column=0, columnspan=10, sticky="nsew") headerGrid = grid_manager(header_Frame) headerGrid.set_grid(numofRows=1, numofColumns=10, borderwidth=5) footerFrame = tkinter.Frame(mainwindow) footerFrame.grid(row=9, column=0, columnspan=10, sticky="nsew") footerGrid = grid_manager(footerFrame, "red") footerGrid.set_grid(numofRows=1, numofColumns=10, borderwidth=5) rightFrame = tkinter.Frame(mainwindow) rightFrame.grid(row=1, column=5, rowspan=5, columnspan=5, sticky="nsew") rightGrid = grid_manager(rightFrame, "blue") rightGrid.set_grid(numofRows=5, numofColumns=5, borderwidth=2) leftFrame = tkinter.Frame(mainwindow) leftFrame.grid(row=3, column=0, rowspan=5, columnspan=4, sticky="nsew") leftGrid = grid_manager(leftFrame, "yellow") leftGrid.set_grid(numofRows=5, numofColumns=4, borderwidth=2) mainwindow.mainloop() 

introduzca la descripción de la imagen aquí

 import tkinter master = tkinter.Tk() tkinter.Button(master, text='ONE ').grid(row=0, column=3, sticky='NW') tkinter.Button(master, text='TWO ').grid(row=1, column=3, sticky='NW') tkinter.Button(master, text='THR ').grid(row=2, column=3, sticky='NW') tkinter.Button(master, text='FOU ').grid(row=3, column=3, sticky='NW') tkinter.Text(master).grid(column=30, columnspan=10)