Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to stop Tkinter Frame from shrinking to fit its contents?

This is the code that's giving me trouble.

f = Frame(root, width=1000, bg="blue") f.pack(fill=X, expand=True)  l = Label(f, text="hi", width=10, bg="red", fg="white") l.pack() 

If I comment out the lines with the Label, the Frame displays with the right width. However, adding the Label seems to shrink the Frame down to the Label's size. Is there a way to prevent that from happening?

like image 753
Johnston Avatar asked Feb 19 '09 03:02

Johnston


People also ask

How do I stop my frames from resizing?

To answer your specific question of how to stop a frame (or any container widget) from resizing to fit its contents, you call either pack_propagate(False) or grid_propagate(False) depending on which geometry manager you are using.

How do I change frame size in Tkinter?

The frame widget in Tkinter works like a container where we can place widgets and all the other GUI components. To change the frame width dynamically, we can use the configure() method and define the width property in it.

What does expand true mean in Tkinter?

When the expand property is true for the widget, it means we can enable the grow property. On the other hand, if the expand property is set to false, it means we will disable the grow property of widgets.

What is the difference between canvas and frame in Tkinter?

A Frame is designed to be a parent container of other widgets. A Canvas is like a canvas that you can draw somethings on it like lines, circles, text, etc. A Canvas can be used as a parent container as well but it is not designed for that at the first place.


1 Answers

By default, both pack and grid shrink or grow a widget to fit its contents, which is what you want 99.9% of the time. The term that describes this feature is geometry propagation. There is a command to turn geometry propagation on or off when using pack (pack_propagate) and grid (grid_propagate).

Since you are using pack the syntax would be:

f.pack_propagate(0) 

or maybe root.pack_propagate(0), depending on which widgets you actually want to affect. However, because you haven't given the frame height, its default height is one pixel so you still may not see the interior widgets. To get the full effect of what you want, you need to give the containing frame both a width and a height.

That being said, the vast majority of the time you should let Tkinter compute the size. When you turn geometry propagation off your GUI won't respond well to changes in resolution, changes in fonts, etc. Tkinter's geometry managers (pack, place and grid) are remarkably powerful. You should learn to take advantage of that power by using the right tool for the job.

like image 59
Bryan Oakley Avatar answered Oct 11 '22 16:10

Bryan Oakley