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

news2025/1/17 0:52:45

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

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

(一)pack 管理器

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

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

我们来给大家举个例子:

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

我们先用 pack 来演示:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. listbox = tk.Listbox(root)

  4. listbox.pack(fill = "both", expand = True)

  5. for i in range(10):

  6. listbox.insert("end", str(i))

  7. root.mainloop()

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

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

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. tk.Label(root, text="Red", bg="red", fg="white").pack(fill="x")

  4. tk.Label(root, text="Green", bg="green", fg="black").pack(fill="x")

  5. tk.Label(root, text="Blue", bg="blue", fg="white").pack(fill="x")

  6. root.mainloop()

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

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. tk.Label(root, text="Red", bg="red", fg="white").pack(side = "left")

  4. tk.Label(root, text="Green", bg="green", fg="black").pack(side = "left")

  5. tk.Label(root, text="Blue", bg="blue", fg="white").pack(side = "left")

  6. root.mainloop()

(二)grid 管理器

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

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

我们还是举例说明:

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

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. # column 默认值是 0

  4. tk.Label(root, text="用户名").grid(row=0)

  5. tk.Label(root, text="密码").grid(row=1)

  6. tk.Entry(root).grid(row=0, column=1)

  7. tk.Entry(root, show="*").grid(row=1, column=1)

  8. root.mainloop()

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

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

  2. tk.Label(root, text="密码").grid(row=1, sticky="w")

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

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. # column 默认值是 0

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

  5. tk.Label(root, text="密码").grid(row=1, sticky="w")

  6. tk.Entry(root).grid(row=0, column=1)

  7. tk.Entry(root, show="*").grid(row=1, column=1)

  8. photo = tk.PhotoImage(file="logo.gif")

  9. tk.Label(root, image=photo).grid(row=0, column=2, rowspan=2, padx=5, pady=5) #跨两行

  10. tk.Button(text="提交", width=10).grid(row=2, columnspan=3, pady=5) #跨3列

  11. root.mainloop()

(二)place 管理器

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

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

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. def callback():

  4. print("正中靶心")

  5. tk.Button(root, text="点我", command=callback).place(relx=0.5, rely=0.5, anchor="center")

  6. root.mainloop()

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

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

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. photo = tk.PhotoImage(file = "Python.gif")

  4. tk.Label(root, image = photo).pack()

  5. def callback():

  6. print("正中靶心")

  7. tk.Button(root, text="点我", command=callback).place(relx=0.5, rely=0.5, anchor="center")

  8. root.mainloop()

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

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. tk.Label(root, bg="red").place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor="center")

  4. tk.Label(root, bg="yellow").place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor="center")

  5. tk.Label(root, bg="green").place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor="center")

  6. root.mainloop()

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

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

Tkinter 布局管理器(一):pack

Tkinter 布局管理器(二):grid

Tkinter 布局管理器(三):place

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt富文本编辑基本知识(QTextBlockFormat、QTextListFormat)

可以参考该文章:QTextBlockFormat、QTextListFormat - 程序员大本营 核心知识如下: 如果想开发一个富文本编辑器(html,markdown等常见格式),Qt已经为用户完成了几乎所有与编辑有关的具体工作,…

工厂模式(FactoryPattern)

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式,可以…

Java:JDK8之后新的时间(推荐使用) ZoneId、 Instant、DataTimeFormatter、Period的相关API

ZoneId //目标:了解时区和带时区的时间。 //1、ZoneId的常见方法: // public static ZoneId systemDefault():获取系统默认的时区 zoneId zoneId ZoneId.systemDefault(); system.out.println(zoneId.getId()); system.out.println(zoneId);// public static Set<String>…

SOME/IP学习笔记1

SOA概念 在SOA中,每个服务就好像我们每一个人在社会中扮演的角色,在对别人提供着服务的同时,同时也享受着别人提供出来的服务,人与人之间,既是彼此独立的,又是需要互相通讯的。服务提供者将功能具象为一组接口,这样使用者就能知道如何调用服务,完成某件事情,得到某个…

亚马逊引流方式有哪些

亚马逊引流是指将潜在的买家从其他渠道引导到亚马逊平台上购买产品。以下是一些常见的亚马逊引流方式&#xff1a; 1、社交媒体营销&#xff1a;通过社交媒体平台如Facebook、Instagram、Twitter等发布有关你产品的信息、广告和优惠活动。吸引潜在客户点击链接&#xff0c;直接…

第七章 递归组件(树组件为例)

递归组件 封装树组件 App.vue <template><div class"App">App<MyTree :dataList"dataList"></MyTree></div> </template><script setup lang"ts"> import { ref, reactive } from "vue"…

Java当中更改源码/修复CVE-2016-1000027漏洞分析

Java当中更改源码/修复CVE-2016-1000027漏洞分析 文章目录 Java当中更改源码/修复CVE-2016-1000027漏洞分析1.基础知识&#xff1a;2.漏洞成因&#xff1a;3.解决方法:4.修改源码: 1.基础知识&#xff1a; ​ 要想分析首先要了解什么是Spring HTTP Invoker&#xff0c;HttpInv…

【考古】Java8 集合工具类Arrays

文章目录 一、概述二、常用方法三、简单使用3.1 Arrays的sort排序3.2 Arrays的binarySearch查找3.3 Arrays的fill填充3.4 Arrays的copyOf复制数组3.5 Arrays的copyOfRange复制部分Arrays的asList数组转链表 四、总结 一、概述 在 Java 的util包中提供了一个Arrays工具类用来操作…

深入了解Redis-实战篇-分布式锁

深入了解Redis-实战篇-分布式锁 一、故事背景二、知识点主要构成1、分布式锁基本原理2、不同实现方式对比3、基于redis的分布式锁3.1、获取锁3.2、释放锁 4、Redisson的可重入锁原理5、Redisson的锁重试和WatchDog机制 三、总结提升 一、故事背景 最近在系统的回顾redis相关的…

系列3-常见的高可用MySQL解决方案

高可用主要解决两个问题&#xff0c;如何实现数据共享和同步数据、如何处理failover&#xff0c;数据共享的解决方案一般是SAN&#xff0c;数据同步通过rsync和drbd技术来实现。 1、主从复制解决方案 这是MySQL自身的高可用解决方案&#xff0c;数据同步方法采用的是MySQL rep…

Eclipse进行debug

目录 基本步骤三种执行方式 -- 键盘快捷键variables面板移除debug过的项目通过eclipse调用具有软件界面的项目进行debug各个variable颜色具有的意义 基本步骤 点击eclipse右上角debug按钮 调出debug面板 点击小蜘蛛图标&#xff08;不是点绿色三角的Run&#xff09; 此时会进…

FPGA实现NIC 100G UDP协议栈网卡,UltraScale+ 100G Ethernet Subsystem驱动,提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、本25G/100G网卡基本性能简介4、详细设计方案接口概述PCIe HIPDMA IFAXI总线接口时钟同步处理TXQ和RXQ队列TXCQ和RXCQ队列完成EQ MAC PHYUltraScale 100G Ethernet Subsystem流水线队列管理发送调度程序端口和接口数据路径以及发送和接收…

怎么把图片变成表格?几个步骤轻松转换

如果您需要将一张图片中的数据转换成表格&#xff0c;这里有几个简单的步骤&#xff0c;可以帮助您完成这个转换过程。以下是需要注意的事项。 首先&#xff0c;我们先了解OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术。然后合理运用…

前端vue uni-app自定义精美海报生成组件

在当前技术飞速发展的时代&#xff0c;软件开发的复杂度也在不断提高。传统的开发方式往往将一个系统做成整块应用&#xff0c;一个小的改动或者一个小功能的增加都可能引起整体逻辑的修改&#xff0c;从而造成牵一发而动全身的情况。为了解决这个问题&#xff0c;组件化开发逐…

【《快速构建AI应用——AWS无服务器AI应用实战》——基于云的解决方案快速完成人工智能项目的指南】

基于云的人工智能服务可以自动完成客户服务、数据分析和财务报告等领域的各种劳动密集型任务。其秘诀在于运用预先构建的工具&#xff0c;例如用于图像分析的Amazon Rekognition或用于自然语言处理的AWS Comprehend。这样&#xff0c;就无须创建昂贵的定制软件系统。 《快速构…

如何用DHTMLX组件为Web应用创建甘特图?(二)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一&#xff0c;DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…

Git在VSCode中的使用

1.Git图像化界面进行项目初始化&#xff08;git init&#xff09; 2. Git图形化界面对文件进行操作 当我们创建一个文件时&#xff0c;该文件后面有一个U&#xff0c;表示文件未跟踪。 我们在管理工具中输入日志并提交代码&#xff0c;相当于做了两件事&#xff0c;将文件由“…

ABB机器人RAPID编程常用指令介绍2

ABB机器人RAPID编程常用指令介绍2 1. 程序运行停止指令 Break 应用:机器人在当前指令行立刻停止运行,程序运行指针指向下一行指令,可以用start键继续运行机器人 举例: … Break; … 与stop指令的区别可以参考下面的示意图: 2. 程序运行停止指令 Exit 应用:机器人在当前指…

分享 一个类似 ps 辅助线功能

效果图片&#xff1a; 提示&#xff1a;这里的样式我做边做了修改&#xff0c;根据个人情况而定。 //你也可以npm下载 $ npm install --save vue-ruler-tool特点 没有依赖可拖动的辅助线快捷键支持 开始使用 1. even.js /*** description 绑定事件 on(element, event, han…

django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)

一、实现的效果 由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下: 点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。 二、实现思路 …