• python之pack布局


    #Pack为一布局管理器,可将它视为一个弹性的容器
    '''1.一个空的widget'''
    #不使用pack
    # -*- coding: cp936 -*-
    from Tkinter imp

    ort *
    root = Tk()
    # 查看当前root下的子组件,解释器没有报异常,说明Pack已创建,并可以使用,此时的输出为空,即root没有任何子组件。
    print root.pack_slaves()
    # 向root中pack一个Label
    Label(root,text = 'pack').pack()
    # 再次打印出root的子组件,可以看到已经包含一个组件,即刚才创建的Label,说明Label调用pack()是将自己加入到了root中。print root.pack_slaves()
    root.mainloop()
    # pack_salves打印当前组件包拥有的子组件,通过这个函数可以查看各个组件是否有包含关系。比如[<Tkinter.Label instance at 0x0143F378>]这个结果

    '''2.root与Pack的关系'''
    # -*- coding: cp936 -*-
    # 使用文字create_text
    from Tkinter import *
    root = Tk()
    # 改变root的大小为80x80
    root.geometry('80x80+0+0') 

    #80x80代表了初始化时主窗口的大小,0,0代表了初始化时窗口所在的位置
    print root.pack_slaves()
    Label(root,text = 'pack').pack()
    print root.pack_slaves()
    root.mainloop()

    #可以看出Pack的结果没有什么变化,它不对root产生影响,也就是说Pack可以“缩小”至只包含一个Label组件,root可以自己控件自己的大小。
    '''3.向Pack中添加多个组件'''
    # -*- coding: cp936 -*-
    # 向Pack中添加多个Label
    from Tkinter import *
    root = Tk()
    # 改变root的大小为80x80
    root.geometry('80x80+0+0')
    print root.pack_slaves()
    for i in range(5):
     

      Label(root,text = 'pack' + str(i)).pack()
    print root.pack_slaves()
    root.mainloop()
    # 使用用默认的设置pack将向下添加组件,第一个在最上方,然后是依次向下排列。注意最后一个Label的显示不完全,原因是我们设定了主窗口大小80x80太小,如果我们改大点,120x120就没问题了。
    '''4.固定设置到自由变化'''
    # 上例中看到label4没有显示完全
    # -*- coding: cp936 -*-
    # 不设置root的大小,使用默认
    from Tkinter import *
    root = Tk()
    #去掉下面的这句
    #root.geometry('80x80+0+0')
    print root.pack_slaves()
    for i in range(5):
        Label(root,text = 'pack' + str(i)).pack()

    print root.pack_slaves()
    root.mainloop()

    print 的结果显示一下:[<Tkinter.Label instance at 0x012DE9E0>, <Tkinter.Label instance at 0x012DE990>, <Tkinter.Label instance at 0x012DEA80>, <Tkinter.Label instance at 0x012E5828>, <Tkinter.Label instance at 0x012E5878>]

    #使用用默认的设置pack将向下添加组件,第一个在最上方,然后是依次向下排列。这样的话最后一个已经显示出来的,这就是为什么称Pack为弹性的容器的原因了,虽然有这个特性,但它并不是总是能够按照我们的意思进行布局,我们可以强制设置容器的大小,以覆盖Pack的默认设置。Pack的优先级低。
    '''5.fill如何控制子组件的布局'''
    # -*- coding: cp936 -*-
    # 不设置root的大小,使用默认
    from Tkinter import *
    root = Tk()
    # 改变root的大小为150x150
    root.geometry('150x150+0+0')
    print root.pack_slaves()
    # 创建三个Label分别使用不同的fill属性
    Label(root,text = 'pack1',bg = 'red').pack(fill = “y”)
    Label(root,text = 'pack2',bg = 'blue').pack(fill = “both”)
    Label(root,text = 'pack3',bg = 'green').pack(fill = “x”)
    print root.pack_slaves()
    root.mainloop()
    #第一个只保证在Y方向填充,第二个保证在XY两个方向上填充,第三个不使用填充属性,注意Pack只会吝啬地给出可以容纳这三个组件的最小区域,它不允许使用剩余的空间了,故下方留有“空白”。

    结果截图:

    Python学习笔记鈥斺擳kinter <wbr>GUI编程鈥斺攑ack
    '''6.expand如何控制组件的布局'''
    # -*- coding: cp936 -*-
    # 这个属性指定如何使用额外的空间,即上例中留下来的“空白”
    from Tkinter import *
    root = Tk()
    # 改变root的大小为150x150
    root.geometry('150x150+0+0')
    print root.pack_slaves()
    # 创建三个Label分别使用不同的fill属性
    Label(root,text = 'pack1',bg = 'red').pack(fill = "y",expand = 1)
    Label(root,text = 'pack2',bg = 'blue').pack(fill = "both",expand = 1)
    Label(root,text = 'pack3',bg = 'green').pack(fill = "x",expand = 0)
    print root.pack_slaves()
    root.mainloop()
    # 第一个只保证在Y方向填充,第二个保证在XY两个方向上填充,第三个不使用填充属性,这个例子中第一个Label和第二个Label使用了expand = 1属性,而第三个使用expand = 0属性,改变root的大小,可以看到Label1和Label2是随着root的大小变化而变化(严格地它的可用空间在变化),第三个只中使用fill 进行X方向上的填充,不使用额外的空间。

    看结果截图:

    Python学习笔记鈥斺擳kinter <wbr>GUI编程鈥斺攑ack 

    可以看到是怎么利用剩余空间的
    '''7.改变组件的排放位置'''
    # 使用side属性改变放置位置
    # -*- coding: cp936 -*-
    from Tkinter import *
    root = Tk()
    # 改变root的大小为150x150
    root.geometry('150x150+0+0')
    print root.pack_slaves()
    # 创建三个Label分别使用不同的fill属性,改为水平放置
    # 将第一个Label居左放置
    Label(root,text = 'pack1',bg = 'red').pack(fill = "y",expand = 1,side = "left")
    # 将第二个Label居右放置
    Label(root,text = 'pack2',bg = 'blue').pack(fill = "both",expand = 1,side = "right")
    # 将第三个Label居左放置,靠Label放置,注意它不会放到Label1的左边
    Label(root,text = 'pack3',bg = 'green').pack(fill = "x",expand = 0,side = "left")
    print root.pack_slaves()
    root.mainloop()

    # 第一个只保证在Y方向填充,第二个保证在XY两个方向上填充,第三个不使用填充属性,这个例子中第一个Label和第二个Label使用了expand = 1属性,而第三个使用expand = 0属性,改变root的大小,可以看到Label1和Label2是随着root的大小变化而变化(严格地它的可用空间在变化),第三个只中使用fill 进行X方向上的填充,不使用额外的空间。

    看截图第一个是原始150x150的大小,第二是变大了后的情况

    Python学习笔记鈥斺擳kinter <wbr>GUI编程鈥斺攑ack

    Python学习笔记鈥斺擳kinter <wbr>GUI编程鈥斺攑ack
    '''8.设置组件之间的间隙大小'''
    # ipadx设置内部间隙
    # padx设置外部间隙
    # -*- coding: cp936 -*-
    # 不设置root的大小,使用默认
    from Tkinter import *
    root = Tk()
    # 改变root的大小为200x150
    # root.geometry('200x150+0+0')
    print root.pack_slaves()
    # 创建三个Label分别使用不同的fill属性,改为水平放置
    # 将第一个LabelFrame居左放置
    L1 = LabelFrame(root,text = 'pack1',bg = 'red')
    # 设置ipadx属性为20
    L1.pack(side = LEFT,ipadx = 20)
    Label(L1,
     

        text = 'inside',
          bg = 'blue'
          ).pack(expand = 1,side = LEFT)
    L2 = Label(root,
               text = 'pack2',
               bg = 'blue'
               ).pack(fill = BOTH,expand = 1,side = LEFT,padx = 10)
    L3 = Label(root,
               text = 'pack3',
               bg = 'green'
               ).pack(fill = X,expand = 0,side = LEFT,pady = 10)
    print root.pack_slaves()

    root.mainloop()
    #为了演示ipadx/padx,创建了一个LabelFrame设置它的ipadx为20,即内部间隔值为20,它的子组件若使用则会留出20个单位;Label2和Label3分别设置x和y方向上的外部间隔值,所有与之排列的组件会与之保留10个单位值的距离

  • 相关阅读:
    调度器2—cat /proc/<pid>/sched内容分析
    调度器1—相关接口和命令行工具
    Java中的String类
    Java中的数组
    代码访问使用Let's Encrypt证书的网站提示certificate has expired的解决方法
    Linux环境Clion使用Protobuf
    PyTorch Dataloader读取时如何在进程之间传输数据
    6 安装Grafana 展示promethues数据
    5 Prometheus relabel配置
    4 PromQL
  • 原文地址:https://www.cnblogs.com/milantgh/p/4198594.html
Copyright © 2020-2023  润新知