ttk.Separator establece la longitud / anchura

¿Cómo establecer / cambiar la longitud / anchura de un objeto ttk.Separator en Tkinter?

ttk.Separator(self, orient='horizontal').grid(column=0, row=0, columnspan=2, sticky='ew') 

Parece que Columnpan intenta hacer el trabajo, pero cuando tiene varios separadores con la misma columna, parecen tener diferentes longitudes, ¿alguna idea de por qué?

Aquí hay un ejemplo simple y rápido de prueba “sucia”:

 import ttk from Tkinter import * class myTestFrame(Frame): def __init__(self): Frame.__init__(self) self.master.title("My Test Frame") self.master.minsize(350, 150) self.grid(sticky=W+N+S+E) firstLayer = Frame(self) firstLayer.pack(side="top", fill="x") secondLayer = Frame(self) secondLayer.pack(side="top", fill="x") thirdLayer = Frame(self) thirdLayer.pack(side="top", fill="x") labelText=StringVar() labelText.set("Enter your area zip code: ") labelDir=Label(firstLayer, textvariable=labelText, fg="black", font = "Calibri 10 bold") labelDir.grid(row=2, column=0, sticky="W") zipCode=IntVar(None) entryFieldFrame=Entry(firstLayer,textvariable=zipCode,width=5) entryFieldFrame.grid(row=2, column=1, sticky="W", padx=31) ttk.Separator(secondLayer, orient='horizontal').grid(column=0, row=0, columnspan=2, sticky='ew') labelText=StringVar() labelText.set("Enter your age: ") labelDir=Label(secondLayer, textvariable=labelText, fg="black", font = "Calibri 10 bold") labelDir.grid(row=2, column=0, sticky="W") age=IntVar(None) age.set(1.0) entryFieldFrame=Entry(secondLayer,textvariable=age,width=5) entryFieldFrame.grid(row=2, column=1, sticky="W", padx=83) ttk.Separator(thirdLayer, orient='horizontal').grid(column=0, row=0, columnspan=2, sticky='ew') labelText=StringVar() labelText.set("Enter your brother's age: ") labelDir=Label(thirdLayer, textvariable=labelText, fg="black", font = "Calibri 10 bold") labelDir.grid(row=2, column=0, sticky="W") brothersAge=IntVar(None) entryFieldFrame=Entry(thirdLayer,textvariable=brothersAge,width=5) entryFieldFrame.grid(row=2, column=1, sticky="W", padx=29) if __name__ == "__main__": testFrame = myTestFrame() testFrame.mainloop() 

Su problema no es que los separadores sean demasiado cortos, es que no le ha dicho a grid qué hacer con el espacio adicional no asignado. Sus columnas son exactamente tan anchas como deben ser, y su separador es tan ancho como las columnas en las que se encuentra. En un comentario usted dice “Quiero que vayan hasta el final de los campos de entrada” y eso es exactamente lo que Ellos están haciendo. Lo que realmente desea es que todos los campos de entrada terminen en la misma ubicación.

La solución rápida es asegurarse de que cuando utiliza la grid , siempre asigne a al menos una fila y una columna un peso distinto de cero. Esto le dice a la grid dónde asignar cualquier espacio extra. En su caso, no ha hecho esto, por lo que en la tercera fila hay espacio que no se usa a la derecha del widget de entrada.

La solución rápida y sucia aquí es asegurarse de que la columna 0 o 1 obtenga el espacio adicional. Por lo general, la opción es darle al widget de entrada. Entonces, puedes agregar esto para mejorar la situación:

 thirdLayer.grid_columnconfigure(1, weight=1) 

Esto resuelve el problema inmediato, pero debe hacer lo mismo para cada uno de sus marcos, así como para la ventana raíz. Para cada cuadro que contenga elementos secundarios administrados por cuadrícula, debe asignar un peso a al menos una fila y una columna.

Como parece que está intentando crear una cuadrícula de tags y widgets de entrada, es posible que desee considerar el uso de un solo marco en lugar de varios marcos. Al usar un solo marco, no tienes que intentar adivinar cuánto relleno usar para que todo se alinee.