'''
Created on 2017年9月5日

@author: Nick
'''


'''Tkinter教程之Pack篇'''

#_*_coding:utf-8_*_
import tkinter as tk
from tkinter import *


if __name__ == '__main__':
    root = tk.Tk()
    root.wm_title('Pack')
    root.wm_minsize(400, 400)#设置窗口最小化大小
    root.wm_maxsize(2800, 2800)#设置窗口最大化大小
    root.resizable(width=True, height=True)#设置窗口宽度不可变,高度可变
    
    #pack_salves打印当前组件包拥有的子组件,通过这个函数可以查看各个组件是否有包含关系。
    # 查看当前root下的子组件,解释器没有报异常,说明Pack已创建,并可以使用,此时的输出为空,即root没有任何子组件。
    print(root.pack_slaves())
    
    Button(root,text = 'pack',fg = 'blue',bg = 'red',width = 10,height = 8).pack(side = LEFT)
    print(root.pack_slaves())
    
    # 1、固定设置到自由变化
    # 使用用默认的设置pack将向下添加组件,第一个在最上方,然后是依次向下排列。这样的话最后一个已经显示出来的,
    # 这就是为什么称Pack为弹性的容器的原因了,虽然有这个特性,但它并不是总是能够按照我们的意思进行布局,我们可以强制设置容器的大小,以覆盖Pack的默认设置。Pack的优先级低。
    fram1 = Frame(root)
    for i in range(5):
        Button(fram1,text = 'pack'+str(i),fg = 'blue',bg = 'red').pack(side = LEFT)
    fram1.pack(side = TOP)
    print(root.pack_slaves())
    
    root.mainloop()
    
    root1 = tk.Tk()
    root1.geometry("180x180+0+0")
    #2、fill如何控制子组件的布局
    #第一个只保证在Y方向填充,第二个保证在XY两个方向上填充,第三个不使用填充属性,注意Pack只会吝啬地给出可以容纳这三个组件的最小区域,它不允许使用剩余的空间了,故下方留有“空白”。
    fill_dict = {1:Y,2:BOTH,3:X}
    # 创建三个Button分别使用不同的fill属性
    for i in fill_dict:
        Button(root1,text = 'pack'+str(i),bg = 'blue').pack(fill = fill_dict[i])
        
    # 3、expand如何控制组件的布局
    # 第一个只保证在Y方向填充,第二个保证在XY两个方向上填充,第三个不使用填充属性,这个例子中第一个Label和第二个Label使用了expand = 1属性,而第三个使用expand = 0属性,
    # 改变root的大小,可以看到Label1和Label2是随着root的大小变化而变化(严格地它的可用空间在变化),第三个只中使用fill进行X方向上的填充,不使用额外的空间。
    Label(root1,text = 'Label1',bg = 'red').pack(fill = Y,expand = 1)
    Label(root1,text = 'Label2',bg = 'blue').pack(fill = BOTH,expand = 1)
    Label(root1,text = 'Label3',bg = 'green').pack(fill = X,expand = 0)
        
    print(root1.pack_slaves()) 
    root1.mainloop()
    
    root2 = tk.Tk()
    root2.geometry("180x180+0+0")
    #4、改变组件的排放位置
    # 第一个只保证在Y方向填充,第二个保证在XY两个方向上填充,第三个不使用填充属性,这个例子中第一个Label和第二个Label使用了expand = 1属性,
    #而第三个使用expand = 0属性,改变root的大小,可以看到Label1和Label2是随着root的大小变化而变化(严格地它的可用空间在变化),第三个只中使用fill进行X方向上的填充,不使用额外的空间。
    Label(root2,text = 'pack1',bg = 'red').pack(fill = Y,expand = 1,side =LEFT)
    Label(root2,text = 'pack2',bg = 'blue').pack(fill = BOTH,expand = 1,side =RIGHT)
    Label(root2,text = 'pack3',bg = 'green').pack(fill = X,expand = 0,side =LEFT)
    
        
    print(root2.pack_slaves())
    
    root2.mainloop()
    
    
    #5、设置组件之间的间隙大小
    # ipadx设置内部间隙
    # padx设置外部间隙
    # 不设置root的大小,使用默认
    root3 = tk.Tk()
    
    # 为了演示ipadx/padx,创建了一个LabelFrame设置它的ipadx为20,即内部间隔值为20,它的子组件若使用则会留出20个单位;Label2和Label3分别设置x和y方向上的外部间隔值,
    # 所有与之排列的组件会与之保留10个单位值的距离
    Label(root3,text = 'pack1',bg = 'blue').pack(side =LEFT)
    Label(root3,text = 'pack2',bg = 'red').pack(side =LEFT,ipadx = 20)
    Label(root3,text = 'pack3',bg = 'green').pack(side =LEFT,pady = 20)
    L1 = LabelFrame(root3,text = 'label1',bg = 'red')
    # 设置ipadx属性为20
    L1.pack(side = LEFT,ipadx = 20)
    Label(L1,text = 'inside',bg = 'blue').pack(expand = 1,side = LEFT)
      
    L2 = Label(root3,text = 'label2',bg = 'blue').pack(fill = BOTH,expand = 1,side = LEFT,padx = 10)
    L3 = Label(root3,text = 'label3',bg = 'green').pack(fill = X,expand = 0,side = LEFT,pady = 20)
    
    print(root3.pack_slaves())
    
    root3.mainloop()    


本文转载:CSDN博客