这节课我们来学习 Tkinter 的布局管理器,那什么是布局管理器呢?说白了,就是用于管理你的组件如何排列。Tkinter 提供了 3 大布局管理器:pack、grid 和 place。

  • pack 是按添加顺序排列组件
  • grid 是按行/列形式排列组件
  • place 则允许程序员指定组件的大小和位置

(一)pack 管理器

对比 grid 管理器,pack 更适用于少量组件的排列,但它在使用上更加简单(就像我们前边所有的例子中,展示一个组件我们一般都直接使用 .pack(),多简单~)。如果你需要创建相对复杂的布局结构,那么建议是使用多个框架(Frame)结构构成,或者使用 grid 管理器实现。

注意:不要在同一个父组件中混合使用 pack 和 grid,因为 Tkinter 会很认真地在那儿计算到底先使用那个布局管理器......以至于你等了半个小时,Tkinter 还在那儿纠结不出结果!

我们来给大家举个例子:

我们常常会遇到一个情况就是 将一个组件放进另一个组件里,并且要求是填充另一个组件,那我们要怎么做呢?

我们先用 pack 来演示:

import tkinter as tkroot = tk.Tk()listbox = tk.Listbox(root)
listbox.pack(fill = "both", expand = True)for i in range(10):listbox.insert("end", str(i))root.mainloop()

其中,fill 选项是告诉窗口管理器该组件将填充整个分配给它的空间,"both" 表示同时横向和纵向扩展,"x" 表示横向,"y" 表示纵向;expand 选项是告诉窗口管理器将父组件的额外空间也填满。

刚才我们说了,pack 是按照组件的添加顺序依次排列的,那么它依次是纵向排列呢,还是横向排列呢?我们做一个演示:

import tkinter as tkroot = tk.Tk()tk.Label(root, text="Red", bg="red", fg="white").pack(fill="x")
tk.Label(root, text="Green", bg="green", fg="black").pack(fill="x")
tk.Label(root, text="Blue", bg="blue", fg="white").pack(fill="x")root.mainloop()

我们可以看到,是纵向填充的。如果想要组件横向挨个儿排放,你可以使用 side 选项:

import tkinter as tkroot = tk.Tk()tk.Label(root, text="Red", bg="red", fg="white").pack(side = "left")
tk.Label(root, text="Green", bg="green", fg="black").pack(side = "left")
tk.Label(root, text="Blue", bg="blue", fg="white").pack(side = "left")root.mainloop()

(二)grid 管理器

grid 管理器可以说是 Tkinter 这三个布局管理器中最灵活多变的。如果你只希望学习使用一个布局管理器,那么 grid 绝对是首选。当你在设计对话框的时候,使用 gird 尤其便捷。如果你此前一直在用 pack 构造窗口布局,那么学习完 grid 你会悔恨当初为啥不早学它。使用一个 grid 就可以简单的实现你用很多个框架和 pack 搭建起来的效果。

注意:不要在同一个父组件中混合使用 pack 和 grid,因为 Tkinter 会很认真地在那儿计算到底先使用那个布局管理器......以至于你等了半个小时,Tkinter 还在那儿纠结不出结果!

我们还是举例说明:

使用 grid 排列组件,只需告诉它你想要将组件放置的位置(行/列,row 选项指定行,cloumn 选项指定列)。此外,你并不用提前指出网格(grid 分布给组件的位置称为网格)的尺寸,因为管理器会自动计算。

import tkinter as tkroot = tk.Tk()# column 默认值是 0
tk.Label(root, text="用户名").grid(row=0)
tk.Label(root, text="密码").grid(row=1)tk.Entry(root).grid(row=0, column=1)
tk.Entry(root, show="*").grid(row=1, column=1)root.mainloop()

默认情况下组件会居中显示在对应的网格里,你可以使用 sticky 选项来修改这一特性。该选项可以使用的值有 "e","w","s","n"(ewsn 分别表示东西南北,即上北下南左西右东)以及它们的组合。因此,我们可以通过 sticky = "w" 使得 Label 左对齐:

tk.Label(root, text="用户名").grid(row=0, sticky="w")
tk.Label(root, text="密码").grid(row=1, sticky="w")

有时候你可能需要用几个网格来放置一个组件,可以做到吗?当然可以,你只需要指定 rowspan 和 columnspan 就可以实现跨行和跨列的功能:

import tkinter as tkroot = tk.Tk()# column 默认值是 0
tk.Label(root, text="用户名").grid(row=0, sticky="w")
tk.Label(root, text="密码").grid(row=1, sticky="w")tk.Entry(root).grid(row=0, column=1)
tk.Entry(root, show="*").grid(row=1, column=1)photo = tk.PhotoImage(file="logo.gif")
tk.Label(root, image=photo).grid(row=0, column=2, rowspan=2, padx=5, pady=5) #跨两行tk.Button(text="提交", width=10).grid(row=2, columnspan=3, pady=5)  #跨3列root.mainloop()

(二)place 管理器

通常情况下不建议使用 place 布局管理器,因为对比起 pack 和 grid,place 要做更多的工作。不过存在即合理,place 在一些特殊的情况下可以发挥妙用。请看下边例子。

比如 我想 :将子组件显示在父组件的正中间:

import tkinter as tkroot = tk.Tk()def callback():print("正中靶心")tk.Button(root, text="点我", command=callback).place(relx=0.5, rely=0.5, anchor="center")root.mainloop()

relx 和 rely 就是相对于 父组件的水平位置 和 垂直位置; anchor="center" 表示居中显示。

在某种情况下,或许你希望一个组件可以覆盖另一个组件,那么 place 又可以派上用场了。下边例子我们演示用 Button 覆盖 Label 组件:

import tkinter as tkroot = tk.Tk()photo = tk.PhotoImage(file = "Python.gif")
tk.Label(root, image = photo).pack()def callback():print("正中靶心")tk.Button(root, text="点我", command=callback).place(relx=0.5, rely=0.5, anchor="center")root.mainloop()

relx 和 rely 选项指定的是相对于父组件的位置,范围是 00 ~ 1.0,因此 0.5 表示位于正中间。那么 relwidth 和 relheight 选项则是指定相对于父组件的尺寸:

import tkinter as tkroot = tk.Tk()tk.Label(root, bg="red").place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor="center")
tk.Label(root, bg="yellow").place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor="center")
tk.Label(root, bg="green").place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor="center")root.mainloop()

上图无论你如何拉伸改变窗口,三个 Label 的尺寸均会跟着改变(神同步~)。x 和 y 选项用于设置偏移(像素),如果同时设置 relx(rely)和 x(y),那 place 将优先计算 relx 和 rely,然后再实现 x 和 y 指定的偏移值。

关于这三个布局管理器的方法和其他选项,可以查看这三个组件的详解。(有分别介绍这三个组件全部内容的博客,下面是链接):

Tkinter 布局管理器(一):pack

Tkinter 布局管理器(二):grid

Tkinter 布局管理器(三):place

《零基础入门学习Python》第076讲:GUI的终极选择:Tkinter13相关推荐

  1. 第031讲:永久存储,腌制一缸美味的泡菜 | 学习记录(小甲鱼零基础入门学习Python)

    (标答出处: 鱼C论坛) <零基础入门学习Python> 测试题: 0.pickle的实质是什么? pickle的实质是利用一些算法,将你的数据对象腌制成二进制文件,存储在磁盘上,也可以放 ...

  2. 第023、024讲:这帮小兔崽子汉诺塔 | 学习记录(小甲鱼零基础入门学习Python)

    (标答出处: 鱼C论坛) <零基础入门学习Python> 测试题: 0.使用递归编写一个十进制转换为二进制的函数(要求采用'取2取余'的方式,结果与调用bin()函数一样返回字符串形式) ...

  3. 第019讲:我的地盘听我的 | 学习记录(小甲鱼零基础入门学习Python)

    (标答出处: 鱼C论坛) <零基础入门学习Python> 测试题: 0.下边程序会输入什么? def next():print('我在next()函数里...')pre()def pre( ...

  4. 零基础python必背代码-零基础入门学习python 96集全

    零基础入门学习python 96集全 第000讲 愉快的开始(视频+课件)xa0 第001讲 我和Python第一次亲密接触(视频+课件)xa0 第002讲 用Python设第一个游戏(视频+课件+源 ...

  5. 零基础入门学习Python,我与python的第一次亲密接触后的感受!

    前言:Python是适合初学者入门最好的语言 Python适合初学者入门最好的语言 人工智能用Python?高考要加入Python?现在连微软官方Excel都要把Python作为官方语言!Python ...

  6. 零基础入门学习Python,我与python的第一次亲密接触后的感受

    前言:Python是适合初学者入门最好的语言 Python适合初学者入门最好的语言 人工智能用Python?高考要加入Python?现在连微软官方Excel都要把Python作为官方语言!Python ...

  7. 零基础学python鱼c-鱼C-小甲鱼 零基础入门学习Python 97节课程

    释放双眼,带上耳机,听听看~! 前言 鱼C-小甲鱼 零基础入门学习Python 97课程 ,这教程Go破解是有学习过的,讲得通俗易懂,即使是小白也能完全掌握里面内容. 其实我一直在Go破解教程这块对大 ...

  8. 零基础入门python小甲鱼-小甲鱼零基础入门学习Python百度云下载 | 宅男君

    Python编程语言可以在不同平台上使用,比如Windows.MAC.Linux操作系统.通常情况下,一个Python程序在你自己的Windows系统上运行,也可以在别人的MAC系统上运行.Pytho ...

  9. python零基础入门教程百度云-小甲鱼零基础入门学习Python百度云下载 | 宅男君

    Python编程语言可以在不同平台上使用,比如Windows.MAC.Linux操作系统.通常情况下,一个Python程序在你自己的Windows系统上运行,也可以在别人的MAC系统上运行.Pytho ...

  10. 小甲鱼零基础学python pdf_鱼C论坛小甲鱼《零基础入门学习python》课程课后题.pdf...

    第 1 课 0. Python 是什么类型的语言? Python 是脚本语言 脚本语言 (Scripting language) 是电脑编程语言,因此也能让开发者藉以编写出 让电脑听命行事的程序. 以 ...

最新文章

  1. 【MySQL】记一次线上重大事故:二狗子竟然把线上数据库删了!!
  2. Vs2005+VSS 2005 老是出问题
  3. 【数据分析】干货!一文教会你 Scrapy 爬虫框架的基本使用
  4. boost::rational模块相关的测试程序
  5. 几种流行Webservice控制框架
  6. Linux系统Shutdown命令定时关机详解
  7. SQL视图学习(入门概念理解)
  8. python中select模块_基于python select.select模块通信的实例讲解 如何用python写个串口通信的程序...
  9. 使用Expression实现数据的任意字段过滤(1)
  10. ABB机器人伺服电机维修故障
  11. MySQL的两阶段提交(数据一致性)
  12. 阅兵方阵(蓝桥杯2018真题)
  13. Ubuntu下locale命令路径无法找到问题解决方法:Cannot set LC_CTYPE to default locale: No such file or directory
  14. 信息安全人员关注网站
  15. 华硕天选 3 和 联想拯救者 Y9000P 2022 款 哪个好
  16. 【AI面试】L1 loss、L2 loss和Smooth L1 Loss,L1正则化和L2正则化
  17. (日常作死)薛定谔之猫
  18. asp毕业设计—— 基于asp+access的网上花店设计与实现(毕业论文+程序源码)——网上花店
  19. OpenGL: 绘制漂亮的围棋子
  20. 机载计算机系统教材,机载计算机系统故障诊断.pdf

热门文章

  1. Android抓取正方系统课程——实现自己的课程表
  2. 通过 Python 预测 2021 年双十一交易额
  3. python自带IDLE(python gui)强大的调试功能
  4. 我应该选一所什么学校--所有选择,都应基于你的需要
  5. 大利好!低学历计算机视觉工程师要起飞了,这波惊喜来的太突然!
  6. Cesium自定义Primitive
  7. c++网络编程:实现简单的聊天——基于服务器/客户端的模式
  8. dnf 跨服 服务器 位置,《DNF》怎么跨区组队交易 2017最新跨区分布图
  9. “黑马程序员”宣传语有奖大征集《参赛作品》
  10. 大数据时代的小数据会消亡吗(非原创)