• 使tkinter开发GUI程序2 -- 窗口组件配置管理Layout Management


    窗口组件配置管理又可以说是控件布局,控件布局通常有pack()、grid()和place()三种方法。

    1.pack()方法

    方法pack()是一种简单的布局方法,如果用不加参数的默认方式,将按布局语句的先后,以最小占用空间的方式自上而下地排列控件实例,并且保持控件本身的最小尺寸。

    用pack()方法不加参数排列标签。为看清楚各控件实例所占用的空间大小,文本使用了不同长度的中英文,并设置relief=GROOVE的凹陷边缘属性。

    1. from tkinter import *
    2. window = Tk()
    3. label_red = Label(window, text='Red', fg='red', relief=GROOVE)
    4. label_red.pack()
    5. label_green = Label(window, text='绿色', fg='green', relief=GROOVE)
    6. label_green.pack()
    7. label_blue = Label(window, text='蓝', fg='blue', relief=GROOVE)
    8. label_blue.pack()
    9. window.mainloop()

    使用pack()方法可设置fill、side等属性参数。其中,参数fill可取值:fill=X,fill=Y或fill=BOTH,分别表示允许控件实例向水平方向、垂直方向或二维伸展填充父容器未被占用的空间。

    参数side可取值:side=TOP(默认),side=LEFT,side=RIGHT,side=BOTTOM,分别表示本控件实例的布局相对于下一个控件实例的方位。另外,使用pack()方法时,窗口组件间的距离是1像素,如果希望有适度间距,可以增加参数padx/pady,代表水平间距、垂直间距,可以分别在组件间增加间距。

    1. from tkinter import *
    2. window = Tk()
    3. label_red = Label(window, text='Red', fg='red', relief=GROOVE)
    4. label_red.pack()
    5. label_green = Label(window, text='绿色', fg='green', relief=GROOVE)
    6. label_green.pack(side=RIGHT)
    7. label_blue = Label(window, text='蓝', fg='blue', relief=GROOVE)
    8. label_blue.pack(fill=X)
    9. window.mainloop()

    2.grid()方法

    grid()是一种以格状(可想成是Excel电子表格)包装和定位窗口组件的方法。方法grid()是基于网格的布局,先虚拟一个二维表格,再在该表格中布局控件实例。由于在虚拟表格的单元格中所布局的控件实例大小不一,单元格也没有固定或均一的大小,因此其仅用于布局的定位。grid()和pack()方法不能混合使用。

    方法grid()常用的布局参数如下:

    column:控件实例的起始列,最左边为第0列。

    columnspan:控件实例所跨越的列数,默认为1列。

    ipadx,ipady:控件实例所呈现区域内部的像素数,用来设置控件实例的大小。

    padx,pady:控件实例所占据空间的像素数,用来设置控件实例所在单元格的大小。

    row:控件实例的起始行,最上面为第0行。

    rowspan:控件实例所跨越的行数,默认为1行。

    用grid()方法排列标签,设想有一个3x4的表格,起始行、列序号均为0。将标签label_red置于第2列第0行;将标签label_green置于第0列第1行;将标签label_blue置于第1列起跨2列第2行,占20像素宽。

    1. from tkinter import *
    2. window = Tk()
    3. label_red = Label(window, text='Red', fg='red', relief=GROOVE)
    4. label_red.grid(column=2, row=0)
    5. label_green = Label(window, text='绿色', fg='green', relief=GROOVE)
    6. label_green.grid(column=0, row=1)
    7. label_blue = Label(window, text='蓝', fg='blue', relief=GROOVE)
    8. label_blue.grid(column=1, columnspan=2, ipadx=20, row=2)
    9. window.mainloop()

     2.1关于columnspan参数,是控件实例所跨越的列数,也可以理解为是控件在column方向的合并数量,先介绍建立一个含8个标签的应用。

    1. from tkinter import *
    2. window = Tk()
    3. window.title("The First Window, Xiaogu") # 窗口标题
    4. lab1 = Label(window, text="标签1", relief="raised")
    5. lab2 = Label(window, text="标签2", relief="raised")
    6. lab3 = Label(window, text="标签3", relief="raised")
    7. lab4 = Label(window, text="标签4", relief="raised")
    8. lab5 = Label(window, text="标签5", relief="raised")
    9. lab6 = Label(window, text="标签6", relief="raised")
    10. lab7 = Label(window, text="标签7", relief="raised")
    11. lab8 = Label(window, text="标签8", relief="raised")
    12. lab1.grid(row=0, column=0)
    13. lab2.grid(row=0, column=1)
    14. lab3.grid(row=0, column=2)
    15. lab4.grid(row=0, column=3)
    16. lab5.grid(row=1, column=0)
    17. lab6.grid(row=1, column=1)
    18. lab7.grid(row=1, column=2)
    19. lab8.grid(row=1, column=3)

    如果希望将标签2和标签3合并,便可以使用columnspan参数。

    lab2.grid(row=0, column=1, columnspan=2)

     2.2关于rowspan参数,是控件实例所跨越的行数,也可以理解为是控件在row方向的合并数量,如果希望合并标签2和标签6,可以使用rowspan参数。

    lab2.grid(row=0, column=1, rowspan=2)

    3. place()方法

    place()方法根据控件实例在父容器中的绝对或相对位置参数进行布局。其常用布局参数如下:

    x,y:控件实例在根窗体中水平和垂直方向上布局的起始位置(单位为像素)。根窗体左上角为0,0,水平向右、垂直向下为正方向。

    relx,rely:控件实例在根窗体中水平和垂直方向上起始布局的相对位置。即相对于根窗体宽和高的比例位置,取值在0.0~1.0之间。

    height,width:控件实例本身的高度和宽度(单位为像素)。

    relheight,relwidth:控件实例相对于根窗体的高度和宽度比例,取值在0.0~1.0之间。

    利用place()方法配合relx,rely和relheight,relwidth参数所得到的界面可自适应根窗体尺寸的大小。

    方法place()与方法grid()可以混合使用。

    使用place()方法直接设定标签的位置:

    1. from tkinter import *
    2. window = Tk()
    3. window.title("The First Window, Xiaogu") # 窗口标题
    4. lab1 = Label(window, text="I like Python",
    5. bg="lightyellow", # 标签背景是浅黄色
    6. width=15) # 标签宽度是15
    7. lab2 = Label(window, text="I like Vision",
    8. bg="lightgreen", # 标签背景是浅绿色
    9. width=15) # 标签宽度是15
    10. lab3 = Label(window, text="I like Ros",
    11. bg="lightblue", # 标签背景是浅蓝色
    12. width=15) # 标签宽度是15
    13. lab1.place(x=0, y=0) # 直接定位
    14. lab2.place(x=30, y=50) # 直接定位
    15. lab3.place(x=60, y=100) # 直接定位
    16. window.mainloop()

     用place()方法排列消息(多行标签):在320x240像素的根窗体上,水平起始位置为相对于根窗体的20%,垂直起始位置为绝对位置80像素,高度为根窗体高度的40%,宽度为200像素,创建并布局消息Message的实例,其用法与标签Label类似。

    1. from tkinter import *
    2. window = Tk()
    3. window.title("The First Window, Xiaogu")
    4. window.geometry('320x240')
    5. msg1 = Message(window, text='''
    6. 此标签的水平起始位置相对窗体0.2,垂直起始位置为绝对位置80像素,高度是窗体高度的0.4,宽度是200像素
    7. ''', relief=GROOVE)
    8. msg1.place(relx=0.2, y=80, relheight=0.4, width=200)
    9. window.mainloop()

  • 相关阅读:
    Spark Streaming(二)
    SOLIDWORKS 2023新功能揭秘!升级版轻松找到材料明细表修改
    客户端post请求,服务器收到{}数据解决方法
    20221120 今天的世界发生了什么
    【HTML】前端网页开发工具Vscode中DOCTYPE和lang以及字符集的作用
    基于SSM框架的图片分享及评价网站设计与实现毕业设计源码201524
    镜头边缘的解析力通常比中心差很多的原因是什么?
    基于 SPICE 协议的硬编推流整合方案在云游戏中的应用
    Splunk自学笔记
    基于卷积神经网络的乳腺癌分类 深度学习 医学图像 计算机竞赛
  • 原文地址:https://blog.csdn.net/weixin_51995147/article/details/125444267