Difference between “fill” and “expand” options for tkinter pack method

前端 未结 2 1254
一个人的身影
一个人的身影 2020-12-13 17:53

I know this is a too trivial question, but I am new to python, and I have just started using the tkinter module. I have actually looked up about it everywhere,

相关标签:
2条回答
  • 2020-12-13 18:18

    From effbot:

    The fill option tells the manager that the widget wants fill the entire space assigned to it. The value controls how to fill the space; BOTH means that the widget should expand both horizontally and vertically, X means that it should expand only horizontally, and Y means that it should expand only vertically.

    The expand option tells the manager to assign additional space to the widget box. If the parent widget is made larger than necessary to hold all packed widgets, any exceeding space will be distributed among all widgets that have the expand option set to a non-zero value.

    So fill tells the widget to grow to as much space is available for it in the direction specified, expand tells the master to take any space that is not assigned to any widget and distribute it to all widgets that have a non-zero expand value.

    The difference becomes clear when running this example:

    import Tkinter as tk
    
    root = tk.Tk()
    root.geometry('200x200+200+200')
    
    tk.Label(root, text='Label', bg='green').pack(expand=1, fill=tk.Y)
    tk.Label(root, text='Label2', bg='red').pack(fill=tk.BOTH)
    
    root.mainloop()
    

    You can see that the label with expand=1 gets assigned as much space as available for it, but only occupies it in the direction specified, Y. The label with fill=tk.BOTH expands in both directions, but has less space available.

    Expand vs Fill

    0 讨论(0)
  • 2020-12-13 18:18

    I'm done with trial and error ;-). Here is an overview.

    import tkinter as tk
    
    root = tk.Tk()
    root.geometry()
    
    for e, expand in enumerate([False, True]):
        for f, fill in enumerate([None, tk.X, tk.Y, tk.BOTH]):
            for s, side in enumerate([tk.TOP, tk.LEFT, tk.BOTTOM, tk.RIGHT]):
                position = '+{}+{}'.format(s * 205 + 100 + e * 820, f * 235 + 100)
                win = tk.Toplevel(root)
                win.geometry('200x200'+position)
                text = str("side='{}'\nfill='{}'\nexpand={}".format(side, fill, str(expand)))
                tk.Label(win, text=text, bg=['#FF5555', '#55FF55'][e]).pack(side=side, fill=fill, expand=expand)
                    
    root.mainloop()
    
    0 讨论(0)
提交回复
热议问题