Evita que el marco Tkinter cambie de tamaño según los tamaños de los widgets

root = Tk() descriptionFrame = Frame(root) definitionFrame = LabelFrame(descriptionFrame, text="Definition") definitionScroll = Scrollbar(definitionFrame) definitionCanvas = Canvas(definitionFrame, width=30, height=4, yscrollcommand=definitionScroll.set) definitionScroll.config(command=definitionCanvas.yview) definitionLabel = Label(definitionCanvas, text="n/a") descriptionFrame.pack() definitionFrame.pack() definitionScroll.pack(side=RIGHT, fill=Y) definitionCanvas.pack(side=LEFT, fill=BOTH, expand=True) definitionLabel.pack(fill=BOTH, expand=True) root.mainloop() 

Tengo este codigo El Lienzo está configurado para tener un ancho de 30 y una altura de 4, pero cuando lo ejecuto, ignora el ancho y la altura del Lienzo y la ventana resultante tiene un tamaño alrededor de la Etiqueta. He intentado usar pack_propagate(False) en cada Frame en el código, pero no afecta nada para el definitionFrame , pero cuando lo uso en descriptionFrame da como resultado una ventana vacía. ¿Cómo crearía una GUI donde todos los marcos y la ventana tengan el tamaño del canvas de ancho 30 y alto 4?

Gracias.

solo los cuadros de lista, texto, canvas y entrada se pueden desplazar de forma predeterminada; Canvas podría funcionar, pero es un poco excesivo IMO, así que aquí hay algo que parece ser lo que quieres usando Text

 #!/usr/bin/python from Tkinter import * root = Tk() descriptionFrame = Frame(root) definitionFrame = LabelFrame(descriptionFrame, text="Definition") definitionScroll = Scrollbar(definitionFrame) definitionText = Text(definitionFrame, width=30, height=4, yscrollcommand=definitionScroll.set) definitionScroll.config(command=definitionText.yview) definitionText.delete("1.0", END) # an example of how to delete all current text definitionText.insert("1.0", "n/a") # an example of how to add new text to the text area descriptionFrame.pack(fill=BOTH, expand=True) definitionFrame.pack(fill=BOTH, expand=True) definitionScroll.pack(side=RIGHT, fill=Y) definitionText.pack(side=LEFT, fill=BOTH, expand=True) root.mainloop() 

Para responder a su pregunta específica sobre cómo evitar que un marco (o cualquier widget de contenedor) pack_propagate(False) de tamaño para ajustarse a su contenido, puede llamar a pack_propagate(False) o grid_propagate(False) según el administrador de geometría que esté usando. Si lo intentaste y no funcionó, lo hiciste mal. Como no has publicado ese código, no podemos diagnosticar qué salió mal.

Cuando llama a pack_propagate(False) , debe asegurarse de que el widget tenga el tamaño adecuado. Las tags y los botones tendrán un tamaño predeterminado para adaptarse a su texto, pero un marco tendrá un tamaño predeterminado de 1×1, lo que hará que el contenido sea casi invisible. Si usa esto en un marco, entonces, asegúrese de darle un ancho y alto explícitos.