- Tkinter GUI Application Development Blueprints(Second Edition)
- Bhaskar Chaudhary
- 1032字
- 2021-06-24 18:35:03
The pack geometry manager
The pack manager can be a bit tricky to explain in words, and it can best be understood by playing with the code base. Fredrik Lundh, the author of Tkinter, asks us to imagine the root as an elastic sheet with a small opening at the center. The pack geometry manager makes a hole in the elastic sheet that is just large enough to hold the widget. The widget is placed along a given inner edge of the gap (the default is the top edge). It then repeats the process till all the widgets are accommodated.
Finally, when all the widgets have been packed in the elastic sheet, the geometry manager calculates the bounding box for all the widgets. It then makes the parent widget large enough to hold all the child widgets.
When packing child widgets, the pack manager distinguishes between the following three kinds of space:
- Unclaimed space
- Claimed but unused space
- Claimed and used space
The most commonly used options in pack include the following:
- side: LEFT, TOP, RIGHT, and BOTTOM (these decide the alignment of the widget)
- fill: X, Y, BOTH, and NONE (these decide whether the widget can grow in size)
- expand: Boolean values such as tkinter.YES/tkinter.NO, 1 / 0, and True/False
- anchor: NW, N, NE, E, SE, S, SW, W, and CENTER (corresponding to the cardinal directions)
- Internal padding ( ipadx and ipady ) for the padding inside widgets and external padding ( padx and pady ), which all default to a value of zero
Let's take a look at demo code that illustrates some of the pack features.
Two of the most commonly used pack options are fill and expand:

The following code (1.04.py) generates a GUI like the one shown in the preceding screenshot:
import tkinter as tk
root = tk.Tk()
frame = tk.Frame(root)
# demo of side and fill options
tk.Label(frame, text="Pack Demo of side and fill").pack()
tk.Button(frame, text="A").pack(side=tk.LEFT, fill=tk.Y)
tk.Button(frame, text="B").pack(side=tk.TOP, fill=tk.X)
tk.Button(frame, text="C").pack(side=tk.RIGHT, fill=tk.NONE)
tk.Button(frame, text="D").pack(side=tk.TOP, fill=tk.BOTH)
frame.pack()
# note the top frame does not expand or fill in X or Y directions
# demo of expand options - best understood by expanding the root
#vwidget and seeing the effect on all the three buttons below.
tk.Label (root, text="Pack Demo of expand").pack()
tk.Button(root, text="I do not expand").pack()
tk.Button(root, text="I do not fill x but I expand").pack(expand = 1)
tk.Button(root, text="I fill x and expand").pack(fill=tk.X, expand=1)
root.mainloop()
The following is a description of the preceding code:
- When you insert the A button in the root frame, it captures the leftmost area of the frame, expands, and fills the Y dimension. Because the fill option is specified as fill=tk.Y, it claims all the area that it wants and fills the Y dimension of its container frame.
- Because frame is itself packed with a plain pack() method with no mention of a pack option, it takes the minimum space required to accommodate all of its child widgets.
- If you increase the size of the root window by pulling it down or sideways, you will see that all the buttons within the frame do not fill or expand with the root window.
- The positioning of the B, C, and D buttons occurs on the basis of the side and fill options specified for each of them.
- The next three buttons (after B, C, and D) demonstrate the use of the expand option. A value of expand=1 means that the button moves its place on resizing the window. Buttons with no explicit expand options stay in their place and do not respond to changes in the size of their parent container (the root window, in this case).
- The best way to study this piece of code would be to resize the root window to see the effect that it has on various buttons.
- The anchor attribute (not used in the preceding code) provides a means to position a widget relative to a reference point. If the anchor attribute is not specified, the pack manager places the widget at the center of the available space or the packing box. The other options that are allowed include the four cardinal directions (N, S, E, and W) and a combination of any two directions. Therefore, valid values for the anchor attribute are CENTER (the default value), N, S, E, W, NW, NE, SW, and SE.
We will use the pack geometry manager in some of our projects. Therefore, it will be worthwhile to get acquainted with pack and its options.
The pack manager is ideally suited for the following two kinds of situation:
- Placing widgets in a top-down manner
- Placing widgets side by side
1.05.py shows an example of both of these scenarios:
parent = tk.Frame(root)
# placing widgets top-down
tk.Button(parent, text='ALL IS WELL').pack(fill=tk.X)
tk.Button(parent, text='BACK TO BASICS').pack(fill=tk.X)
tk.Button(parent, text='CATCH ME IF U CAN').pack(fill=tk.X)
# placing widgets side by side
tk.Button(parent, text='LEFT').pack(side=tk.LEFT)
tk.Button(parent, text='CENTER').pack(side=tk.LEFT)
tk.Button(parent, text='RIGHT').pack(side=tk.LEFT)
parent.pack()
The preceding code produces a GUI, as shown in the following screenshot:

For a complete pack reference, type the following command in the Python shell:
>> import tkinter
>>> help(tkinter.Pack)
Besides getting interactive help with documentation, Python's REPL is also a great tool for iterating and quick prototyping of Tkinter programs.
Using the pack manager is somewhat complicated as compared to the grid method, which will be discussed next, but it is a great choice in situations such as the following:
- Having a widget fill the complete container frame
- Placing several widgets on top of each other or side by side (as shown in the preceding screenshot)
Although you can create complicated layouts by nesting widgets in multiple frames, you will find the grid geometry manager more suitable for most complex layouts.
- The Complete Rust Programming Reference Guide
- JavaScript修煉之道
- 算法基礎:打開程序設計之門
- Java編程指南:基礎知識、類庫應用及案例設計
- R語言數據可視化實戰
- JavaScript從入門到精通(第3版)
- JavaScript 程序設計案例教程
- Gradle for Android
- Scala for Machine Learning(Second Edition)
- OpenCV with Python By Example
- Hands-On Nuxt.js Web Development
- Apache Camel Developer's Cookbook
- Orchestrating Docker
- Python Deep Learning
- Mastering VMware Horizon 7(Second Edition)