用Tkinter打造GUI开发工具(11)Tkinter小部件的pack布局

用Tkinter打造GUI开发工具(11)Tkinter小部件的pack布局
Tkinter 共有三种小部件的几何布局管理器,分别是:pack布局,grid布局,place布局。通过几何布局管理器控制窗体或容器中各个小部件的位置关系。首先介绍小部件的pack布局。
使用pack()方法的时候,默认先使用的放到上面,然后依次向下排,它会给我们的部件一个自认为合适的位置和大小,这是默认方式。pack()方法不能和grid()方法混用。
使用pack()显示一个小部件w,其语法格式如下。

w.pack(option=value, ...)

pack()部件放置方法参数option

参数 说明
after 将部件置于其它部件之后。
before 将部件置于其它部件之前。
anchor 部件的对齐方式,顶对齐N,底对齐S,左对齐W,右对齐E。值为:N,NE,E,SE,S,SW,W,NW,CENTER。
side 部件在主窗口的位置,可以为LEFT,TOP,RIGHT,BOTTOM。
fill 填充方式 (Y垂直,X水平,BOTH水平+垂直,NONE),是否在某个方向充满窗口。
expand YES可扩展,NO不可扩展,代表控件是否会随窗口缩放。

pack()函数也可以接受几个参数说明。
anchor 参数可以是N,E,S,W或者它们的组合,或者是 CENTER(表示中间)。N,E,S,W原本英文方向的首字母,这里代表上下左右。N:北,上,顶;S:南,下,底;W:西,左;E:东,右。口诀“上北下南左西右东”。
side 参数指定了它停靠在哪个方向,可以为 LEFT,TOP,RIGHT,BOTTOM,分别代表LEFT左,TOP上,RIGHT右,BOTTOM下。
fill 参数可以是 X,Y,BOTH 和 NONE,即X在水平方向填充,Y在竖直方向填充,BOTH是同时在水平和竖直方向填充;NONE不填充。
expand 参数可以是 YES 和 NO。YES表示填充,NO表示不填充。
pack()函数的 ipadx 表示x方向的内边距, ipady 表示y方向的内边距,padx 表示表示x方向的外边距,pady 表示y方向的外边距。
Tkinter的Pack类,除了pack()方法外,还提供有以下几个方法。
pack_forget()方法,用于删除pack()方法的部件显示。Tkinter中也可以用forget()方法。部件仅仅不显示了,部件对象没有删除,旧位置也会消除。如果需要再显示,可以在新位置用pack()方法。
pack_info()方法,用于显示pack()方法的设置信息。返回关于pack()方法中参数的一个字典数据。
pack_configure()方法,用于配置pack()方法的部件。

下面看一个Frame派生类View3,通过pack()方法,把窗口可以无限分割下去,如果你看懂代码,你就会明白上一文中,“口”,“日”,“目”是怎么设计出来的。

# -*- coding: utf-8 -*-
import tkinter as tk  #装载tkinter模块,用于Python3
import random

###############
#  1  #   2   #
###############
#     3       #
###############
class view3(tk.Frame): # 继承Frame类  
    def __init__(self, root=None):  
        tk.Frame.__init__(self, root)  
        self.root = root #定义内部变量root  
        self.m=3
        self.v=[]
        self.vm=tk.Frame(self)
        self.v1=tk.Frame(self.vm)
        self.v2=tk.Frame(self.vm)
        self.v3=tk.Frame(self)
        
        self.vm.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
        self.v3.pack(side=tk.BOTTOM,expand=1,fill=tk.BOTH,ipady=1,pady=1,ipadx=1,padx=1)        
        self.v1.pack(side=tk.LEFT, fill=tk.BOTH, expand=1,ipady=1,pady=1,ipadx=1,padx=1)
        self.v2.pack(side=tk.RIGHT,expand=1,fill=tk.BOTH,ipady=1,pady=1,ipadx=1,padx=1)
        self.v.append(self.v1)
        self.v.append(self.v2)
        self.v.append(self.v3)
        
root=tk.Tk()  #创建Tkinter主窗口
root.title("Pack方法")
width=800  #把窗口宽度(单位:像素)800赋值给变量width
height=600  #把窗口高度(单位:像素)600赋值给变量height
root.geometry('{}x{}'.format(width,height))  #改变窗口大小
v3=view3(root)
v3.pack(fill=tk.BOTH, expand=1)
for i in range(v3.m):
    bg='#%02x%02x%02x'%(random.randint(150,255),random.randint(150,255),random.randint(150,255))
    v3.v[i]['bg']=bg

v4=view3(v3.v[v3.m-1])
v4.pack(fill=tk.BOTH, expand=1)
for i in range(v4.m):
    bg='#%02x%02x%02x'%(random.randint(150,255),random.randint(150,255),random.randint(150,255))
    v4.v[i]['bg']=bg
    tk.Label(v4.v[i],text='v4.v[%d]'%i).pack()


v5=view3(v3.v[v3.m-3])
v5.pack(fill=tk.BOTH, expand=1)
for i in range(v5.m):
    bg='#%02x%02x%02x'%(random.randint(150,255),random.randint(150,255),random.randint(150,255))
    v5.v[i]['bg']=bg
    tk.Label(v5.v[i],text='v5.v[%d]'%i).pack()


v6=view3(v3.v[v3.m-2])
v6.pack(fill=tk.BOTH, expand=1)
for i in range(v6.m):
    bg='#%02x%02x%02x'%(random.randint(150,255),random.randint(150,255),random.randint(150,255))
    v6.v[i]['bg']=bg
    tk.Label(v6.v[i],text='v6.v[%d]'%i).pack()
    
root.mainloop( ) #启动Tk主循环

程序运行结果见下图。背景颜色是随机的。
在这里插入图片描述
ttk.Notebook的tab控件,只能在左上角。如果想实现在左下角,就要自己开发程序了。我做了一个简单的新控件,可以把tab控制按钮设置的最下面。
在这里插入图片描述

发布了56 篇原创文章 · 获赞 67 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/hepu8/article/details/89391207