• python tkinter pack布局遇到的错误和问题总结(无图)


    综述:不论哪种布局管理器,都要清楚的概念是相对位置。它的好处是窗口是随时都可变的,如果由相对位置来定位控件会比较方便。
    体现在padx,pady,ipadx,ipady(pack,grid都有)和grid的对齐stick属性等等方面。

    tkinter读python官方文档学不到什么(感觉里面内容是缩水的)

    推荐的网站:https://tkdocs.com/tutorial/index.html

    1.pack中关于expand,side,fill组合时的使用:
    fill--设置控件填满所分配空间的方向
    expand--设置是否填满额外的父容器空间
    一个特殊的案例:
    ·误区:有fill一定要有expand吗?
    from tkinter import *
    root = Tk()
    root.geometry("500x500+500+150")
    Frame(root, bg='Blue', height=200,).pack(side=TOP, fill=X, expand=1)
    root.mainloop()
    以上的高度和窗口的大小单位都是像素,所以Frame比root要小,但结果是由于expand的干扰,
    Frame没有做到side=TOP,如果不写expand=1就会正确,所以当时看csdn的帖子有人说expand会使side“无效”。
    但如果去测试对多个控件都设置同样的side=TOP,fill=X,和expand=1,会发现side仍在发挥作用。所以也不是完全的无效。
    真实失效的是expand=1,它的存在不会影响到fill的行动,由于没有设置那个方向的起始大小,而是fill完全填充了那个方向。

    ·逻辑类错误:
    fill的方向与设置同方向的属性冲突:
    Frame(root, bg='Blue', height=30, width=30).pack(side=TOP, fill=X, )
    结果:width失效,后面的语句fill起效
    缺少某一个方向属性的设置:
    Frame(root, bg='Blue', height=30, ).pack(side=TOP, fill=Y, )
    结果:该方向的默认值为1,单位是像素(几乎看不到)

    ·side的“锁定”效果:
    基于上面的逻辑类错误1,如果写成:
    Frame(root, bg='Blue', height=30, width=30).pack(side=TOP, fill=Y, )
    结果:fill=Y失效了,与我分析的“pack是后面的语句,后执行,覆盖之前的影响”的理论矛盾了。故得出side会“锁定”这个方向。

    ·height,width等属性错误:
    很多控件都有height,width,padx等等属性,但是它们单位可能不同,一是字符Label['height']=1是可行的,但是如果Frame['height']=1,
    你很容易认为没有看到Frame控件,因为它单位是像素。

    2.常见赋值错误
    l1 = Label(text='1',bg='Blue').pack()
    此时l1为NoneType,想用变量就得把设置和pack分开写。

    3.三种布局管理器可以混用吗?
    不同种布局管理器作用在同一个父容器中会冲突(混用失败)
    在对一个父容器是root的控件使用gird之后,又对一个父容器为root的控件使用pack会报以下的错。
    _tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid
    而且两者单独显示的时候是在窗口的两个互不重合的位置,说明每种管理器是抢着控制根窗口root的。那么可以在两个不同的父容器之间,用不同的布局方法吗?
    不同种管理器可以应用到不同的父容器里(混用成功)
    f2 = Frame(root, bg='Red',height=200,width=300)
    f2.pack(anchor='ne')
    Label(f2, text='1', bg='Green', height=20, width=20).grid(row=0, column=0)
    Label(f2, text='2', bg='Blue', height=20, width=20).grid(row=0, column=1)
    print('height=', f2.cget('height'), 'width=', f2.cget('width'))
    因为根窗口也只是一个容器罢了,它可以应用三种布局中的一种,那么其他容器也可以这么使用。
    但要注意的是,在这个容器里的所有控件的布局管理选择是要一致的,否则会报错。
    比如:在一个LabelFrame里有三个控件(它自己是用的pack),两个用gird,另一个用pack。
    gird会报错说它的父容器已经使用pack了。但错误不在他这里。而在那个pack控件里。

  • 相关阅读:
    题目1101:计算表达式
    九度oj 题目1107:搬水果
    [Hihocoder] 字符串排序
    [hzwer] 模拟T
    [Luogu] 宝藏
    [Luogu] 列队
    [Luogu] 奶酪
    [Luogu] 逛公园
    [Luogu] 时间复杂度
    [Luogu] 小凯的疑惑
  • 原文地址:https://www.cnblogs.com/s1mplelectronic/p/13972093.html
Copyright © 2020-2023  润新知