【Tkinter系列01/5】界面初步和布局

news2024/11/16 15:43:27

一、说明

        一般来说,界面开发中,如果不是大型的软件,就不必用QT之类的实现,用Tkinter已经足够,然而即便是Tkinter规模不大,也需要一个系统专业的学习过程,本篇将是对Tkinter系列介绍的一篇博文。

二. 一个最小的应用程序

这是一个简单的Tkinter程序,仅包含一个退出按钮:

#!/usr/bin/env python      1
import Tkinter as tk       2

class Application(tk.Frame):              3
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)   4
        self.grid()                       5
        self.createWidgets()

    def createWidgets(self):
        self.quitButton = tk.Button(self, text='Quit',
            command=self.quit)            6
        self.quitButton.grid()            7

app = Application()                       8
app.master.title('Sample application')    9
app.master.geometry("300x300") 10
app.mainloop()       11

代码解释 

1 假设您的系统已正确安装 Python,此行将使脚本自动执行。
2 此行将Tkinter模块导入到程序的命名空间中,但将其重命名为tk.
3 您的应用程序类必须继承自 Tkinter的Frame 类。
4 调用父类的构造函数 Frame。
5 使应用程序实际出现在屏幕上所必需的。
6 创建一个标记为“退出”的按钮。
7 将按钮放置在应用程序上。
8 主程序从实例化该类开始 Application。
9此方法调用将窗口的标题设置为“示例应用程序”
10 设置窗口的几何尺寸
11 启动应用程序的主循环,等待鼠标和键盘事件。 

三、基本组件术语

        在继续之前,我们先定义一些常用术语。

        window 窗户

        该术语在不同的上下文中具有不同的含义,但通常它指的是显示屏上某处的矩形区域。

        top-level window顶层窗口

        独立存在于屏幕上的窗口。它将用系统桌面管理器的标准框架和控件进行装饰。您可以在桌面上移动它。您通常可以调整它的大小,尽管您的应用程序可以阻止这种情况

        widget小部件

        构成图形用户界面中的应用程序的任何构建块的通用术语。小部件的示例:按钮、单选按钮、文本字段、框架和文本标签。

        Frame框架

        在Tkinter中,Frame小部件是复杂布局的基本组织单元。框架是可以包含其他小部件的矩形区域。

        child, parent孩子、父母

当创建任何小部件时,就会创建父子关系。例如,如果将文本标签放置在框架内,则框架是标签的父级。

四.布局管理

        稍后我们将讨论小部件,即 GUI 应用程序的构建块。小部件如何在窗口中排列?

        尽管Tkinter 中有三种不同的“几何管理器” ,但作者强烈喜欢.grid()几何管理器来处理几乎所有的事情。该管理器将每个窗口或框架视为一个表格——行和列的网格。

  • 单元是一行和一列相交的区域。

  • 每列的宽度是该列中最宽单元格的宽度。

  • 每行的高度是该行中最大单元格的高度。

  • 对于未填充整个单元格的小部件,您可以指定如何处理额外的空间。您可以在小部件外部保留额外的空间,或者在水平或垂直维度上拉伸小部件以适应它。

  • 您可以将多个单元格合并为一个更大的区域,这一过程称为生成

        当您创建一个小部件时,直到您将其注册到几何管理器后,它才会出现。因此,构建和放置小部件是一个两步过程,如下所示:

self.thing = tk.Constructor(parent, ...)
    self.thing.grid(...)

        其中是、 等Constructor 小部件类之一,是在其中构造该子小部件的父小部件。所有小部件都有一个 方法,您可以使用该方法告诉几何管理器将其放置在哪里。 ButtonFrameparent.grid()

4.1. 方法.grid()_

w要在应用程序屏幕上 显示小部件 :

<span style="background-color:#e0e0e0"><span style="color:#663300">    <em><code>w</code></em>.grid( <em><code>option</code></em>= <em><code>value</code></em>, ...)
</span></span>

        此方法w向网格几何管理器注册一个小部件 - 如果您不这样做,该小部件将在内部存在,但在屏幕上不可见。有关选项,请参见表1,“几何管理器的参数.grid()”。

        表 1..grid()几何管理器的参数

column您希望小部件网格化的列号,从零开始计数。默认值为零。
columnspan通常,一个小部件仅占据网格中的一个单元格。但是,您可以通过将该选项设置为单元格数量来抓取一行中的多个单元格并将它们合并为一个更大的单元格columnspan。例如,w.grid(row=0, column=2, columnspan=3) 将小部件放置w在跨越第 0 行第 2、3 和 4 列的单元格中。
in_要注册w为某个小部件的子级,请使用。新的父级必须是创建 时使用的小部件的后代。w2in_=w2w2parentw
ipadx内部 x 填充。该尺寸被添加到小部件的左侧和右侧内。
ipady内部 y 填充。该尺寸被添加到小部件的顶部和底部边框内。
padx外部 x 填充。该尺寸被添加到小部件外部的左侧和右侧。
pady外部 y 填充。该尺寸添加在小部件的上方和下方。
row要插入小部件的行号,从 0 开始计数。默认值是下一个编号较高的未占用行。
rowspan通常,一个小部件仅占据网格中的一个单元格。rowspan但是,您可以通过将该选项设置为要抓取的单元格数量来抓取一列的多个相邻单元格。columnspan此选项可以与抓取单元格块的选项结合使用。例如,w.grid(row=3, column=2, rowspan=4, columnspan=5)将小部件放置w在由 20 个单元格合并而成的区域中,行号为 3-6,列号为 2-6。
sticky此选项确定如何分配单元格内小部件以其自然大小未占用的任何额外空间。见下文。
 
  • 如果您不提供sticky 属性,则默认行为是将小部件在单元格中居中。

  • 您可以使用sticky=tk.NE(右上角)、tk.SE(右下角)、tk.SW (左下角)或tk.NW(左上角)将小部件放置在单元格的一角。

  • 您可以使用sticky=tk.N(顶部中心)、tk.E(右侧中心)、 tk.S(底部中心)或tk.W (左侧中心)将小部件定位在单元格一侧的中心。

  • 用于sticky=tk.N+tk.S垂直拉伸小部件,但使其水平居中。

  • 用于sticky=tk.E+tk.W水平拉伸但使其垂直居中。

  • 用于sticky=tk.N+tk.E+tk.S+tk.W水平和垂直拉伸小部件以填充单元格。

  • 其他组合也将起作用。例如,sticky=tk.N+tk.S+tk.W将垂直拉伸小部件并将其放置在西(左)墙上。

4.2. 其他网格管理方法

        这些与网格相关的方法在所有小部件上定义:

   w.grid_bbox(column=None, row=None, col2=None, row2=None)

        返回一个 4 元组,描述 widget 中部分或全部网格系统的边界框w。返回的前两个数字是区域左上角的 x和坐标,后两个数字是宽度和高度。y

        如果传入columnrow参数,则返回的边界框描述该列和行的单元格区域。如果您还传入col2和 参数,则返回的边界框描述从列到包含范围以及从行到 包含范围row2的网格区域。 columncol2rowrow2

        例如,w.grid_bbox(0, 0, 1, 1)返回四个单元格的边界框,而不是一个。

   w.grid_forget()

        此方法使小部件w 从屏幕上消失。它仍然存在,只是不可见。您可以使用.grid()它使其再次出现,但它不会记住其网格选项。

   w.grid_info()

        返回一个字典,其键是w的选项名称以及这些选项的相应值。

   w.grid_location(xy)

        给定相对于包含的小部件的 坐标,此方法返回一个元组,描述 的网格系统的哪个单元格包含该屏幕坐标。 (xy)(colrow)w

   w.grid_propagate()

        通常,所有小部件 都会传播其尺寸,这意味着它们会进行调整以适应内容。但是,有时您希望强制小部件具有特定大小,而不管其内容的大小。为此,请调用 w.grid_propagate(0)where w is the widget that you want to Forced 大小。

   w.grid_remove()

        此方法类似于 .grid_forget(),但它的网格选项会被记住,因此如果您 .grid()再次使用,它将使用相同的网格配置选项。

   w.grid_size()

w返回一个 2 元组,其中分别包含的网格系统 中的列数和行数。

   w.grid_slaves(row=None, column=None)

        返回由 widget 管理的小部件列表 w。如果未提供参数,您将获得所有托管小部件的列表。使用row=参数仅选择一行中的小部件,或使用column=参数仅选择一列中的小部件。

4.3. 配置列和行的大小

        除非您采取某些措施,否则给定小部件内的网格​​列的宽度将等于其最宽单元格的宽度,并且网格行的高度将是其最高单元格的高度。小部件上的属性 sticky仅控制小部件未完全填充单元格时的放置位置。

        如果您想覆盖列和行的自动调整大小,请在 包含网格布局的 小部件上使用以下方法:w

   w.columnconfigure(Noption=value, ...)

        在小部件内的网格​​布局中w,配置列,N以便给定具有option给定value。有关选项,请参见下表。

   w.rowconfigure(Noption=value, ...)

        在小部件内的网格​​布局中w,配置行,N 以便给定具有option给定value。有关选项,请参见下表。

        以下是用于配置列和行大小的选项。

.grid()表 2.几何管理器的列和行配置选项

minsize列或行的最小大小(以像素为单位)。如果给定的列或行中没有任何内容,即使您使用此选项,它也不会出现。
pad将添加到给定列或行、列或行中最大单元格上方的像素数。
weight

要使列或行可拉伸,请使用此选项并提供一个值,该值给出分配额外空间时该列或行的相对权重。例如,如果小部件w包含网格布局,这些行会将额外空间的四分之三分配给第一列,将四分之一分配给第二列:

w.columnconfigure(0, weight=3)

w.columnconfigure(1, weight=1)

如果不使用此选项,列或行将不会拉伸。

4.4. 使根窗口可调整大小

您想让用户调整整个应用程序窗口的大小,并在其内部小部件之间分配额外的空间吗?这就需要一些不明显的操作。

有必要使用第 4.3 节“配置列和行大小”中描述的行和列大小管理技术,以使Application小部件的网格可拉伸。然而,仅此还不够。

考虑第 2 节“最小应用程序” 中讨论的简单应用程序,它仅包含一个退出按钮。如果运行此应用程序并调整窗口大小,按钮将保持相同大小,并位于窗口中央。

这是最小应用程序.__createWidgets()中 该方法的替换版本。在此版本中,“退出”按钮始终填满所有可用空间。

  def createWidgets(self):
        top=self.winfo_toplevel()                1
        top.rowconfigure(0, weight=1)            2
        top.columnconfigure(0, weight=1)         3
        self.rowconfigure(0, weight=1)           4
        self.columnconfigure(0, weight=1)        5
        self.quit = Button(self, text='Quit', command=self.quit)
        self.quit.grid(row=0, column=0,          6
            sticky=tk.N+tk.S+tk.E+tk.W)
11

“顶层窗口”是屏幕上最外面的窗口。然而,这个窗口不是您的Application 窗口——它是实例 的父窗口Application。要获取顶级窗口,请.winfo_toplevel()在应用程序中的任何小部件上调用该方法;请参见第 26 节“通用小部件方法”。

22

该行使顶层窗口网格的第 0 行可拉伸。

33

此行使顶层窗口网格的第 0 列可拉伸。

44

使Application小部件网格的第 0 行可拉伸。

55

使Application小部件网格的第 0 列可拉伸。

66

该参数sticky=tk.N+tk.S+tk.E+tk.W 使按钮展开以填充其网格单元格。

还有一项必须做出的改变。在构造函数中,更改第二行,如下所示:

   def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid(sticky=tk.N+tk.S+tk.E+tk.W)
        self.createWidgets()

        参数sticky=tk.N+tk.S+tk.E+tk.aW是 self.grid()必需的,以便Application小部件能够扩展以填充顶级窗口网格的单元格。

Tkinter 8.5 reference: a GUI for Python

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

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

相关文章

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第五天&#xff09;MyBatis的注解开发 ​ 昨天我们深入学习了MyBatis多表之间的关联映射&#xff0c;了解掌握了一对一关联映射&#xff0c;一对多关联映射&#xff0c;嵌套查询方…

基于Milvus Cloud的相似穿搭推荐系统教程——图像分割

作为一个大众眼中的“非典型程序员”,我喜欢拥抱时尚和潮流,比如我经常在演讲时穿粉色裤子,这甚至已经成为一个标志性打扮。某天又逢主题演讲日,我站在衣柜前挑选上衣的时候,忽然灵光乍现:有没有可能借助 Milvus Cloud找到和我穿搭风格最为相似的明星呢? 这个想法在我脑…

不系安全带抓拍自动识别

不系安全带抓拍自动识别系统通过yolo系列算法框架模型利用高清摄像头&#xff0c;不系安全带抓拍自动识别算法对高空作业场景进行监控&#xff0c;当检测到人员未佩戴安全带时会自动抓拍并进行告警记录。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用ancho…

Day44|leetcode 518.零钱兑换II、377. 组合总和 Ⅳ

完全背包理论基础 视频链接&#xff1a;带你学透完全背包问题&#xff01; 和 01背包有什么差别&#xff1f;遍历顺序上有什么讲究&#xff1f;_哔哩哔哩_bilibili 完全背包与01背包不同的地方就是&#xff1a;01背包每种物品只能取一次&#xff0c;而完全背包每种物品可以取…

【排序】快速排序(前后指针法)—— 考的最少的一种算法

以从小到大的顺序进行说明。 前后指针法 是指对于一个数组&#xff0c;定义前后各一个指针&#xff08;prev 和 cur&#xff09; prev用于卡一个比基准值大的值进行交换cur用于向前遍历出比基准值小的&#xff0c;和prev进行交换 图解 初始化 选出基准值4 如果cur 所在的值…

重要岗位人员脱岗预警 脱岗监测预警算法

重要岗位人员脱岗预警 脱岗监测预警算法通过yolov8网络模型深度学习算法&#xff0c;重要岗位人员脱岗预警 脱岗监测预警算法对现场人员行为进行实时监测和识别&#xff0c;通过算法识别脱岗、睡岗和玩手机等异常行为&#xff0c;实现对人员行为的预警和告警。YOLOv8是目前YOLO…

java八股文面试[多线程]——什么是守护线程

知识来源&#xff1a; 【2023年面试】什么是守护线程_哔哩哔哩_bilibili

【Linux】DNS系统,ICMP协议,NAPT技术

遏制自己内心的知识优越感&#xff0c;才能让你发自内心的去尊重他人&#xff0c;避免狂妄自大&#xff0c;才能让你不断的丰富自己的内心。 文章目录 一、DNS系统1.DNS服务器返回域名对应的ip2.使用dig工具分析DNS过程3.浏览器中输入url后发生的事情&#xff1f; 二、ICMP协议…

【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter

目录 一. &#x1f981; 前言二. &#x1f981; Spring-boot starter 原理实现分析2.1 自动配置原理 三. &#x1f981; 操作实践3.1 项目场景3.2 搭建项目3.3 添加相关依赖3.4 删除一些不需要的东西3.5 发邮件工具类逻辑编写3.6 创建相关配置类3.7 创建 Spring.factories 文件…

java八股文面试[多线程]——死锁、活锁、饥饿

DCL双重锁&#xff1a;TODO 如何预防死锁&#xff1a; 如何查看线程死锁&#xff1a; 知识来源&#xff1a; 【2023年面试】描述一下线程安全活跃态问题&#xff0c;以及竞态条件_哔哩哔哩_bilibili 【2023年面试】如何预防死锁_哔哩哔哩_bilibili 【并发与线程】阿里一面&…

手把手教你用 ANSYS workbench

ANSYS Workbench ANSYS Workbench是一款基于有限元分析&#xff08;FEA&#xff09;的工程仿真软件。其基本概念包括&#xff1a; 工作区&#xff08;Workspace&#xff09;&#xff1a;工程仿真模块都在此区域内&#xff0c;包括几何建模、网格划分、边界条件设置、分析求解等…

锐捷PPP协议原理--尚文网络敏姐

PPP 点对点协议 目录 PPP 点对点协议 PPP 简介 PPP协议层介绍&#xff1a; PPP协议工作原理 第一个阶段&#xff1a;LCP协商 第二阶段&#xff1a;身份认证阶段 第三阶段&#xff1a;NCP协商阶段 PPP配置实验 PAP的单向认证&#xff1a; PAP双向认证 CHAP的单向认证&#…

数组名和函数名是指针?指针和引用底层一样?

在2023/8/26日晚上&#xff0c;我看到一个所谓“典”的视频&#xff0c;一开始还没太在意&#xff0c;后面想了想发现我貌似也一直犯了以下的错误&#xff0c;而错误的原因在于我在新手阶段学习C/C并不是查阅文档扎好脚步学习的&#xff0c;而是被铺天盖地的新手学习基础教程里…

图书管理系统Java书店进销存jsp源代码MySQL

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 图书管理系统 系统有1权限&#xff1a;管理员 用所技…

5.网络原理之初识

文章目录 1.网络发展史1.1独立模式1.2网络互连1.3局域网LAN1.3.1基于网线直连1.3.2基于集线器组建1.3.3基于交换机组建1.3.4基于交换机和路由器组建1.3.4.1路由器和交换机区别 1.4广域网WAN 2.网络通信基础2.1IP地址2.2端口号2.3认识协议2.4五元组2.5 协议分层2.5.1 分层的作用…

weak_ptr是怎么探知对象生死的

weak_ptr是C智能指针中的一种。它用于解决共享所有权的问题&#xff0c;并且可以避免因循环引用而导致的内存泄漏。 weak_ptr本身并不承担对象的所有权&#xff0c;它指向由shared_ptr管理的对象。与shared_ptr不同&#xff0c;weak_ptr并不会增加计数器来计算对象的引用次数。…

【30天熟悉Go语言】11 数组的全方位使用与解析

作者&#xff1a;秃秃爱健身&#xff0c;多平台博客专家&#xff0c;某大厂后端开发&#xff0c;个人IP起于源码分析文章 &#x1f60b;。 源码系列专栏&#xff1a;Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列&#xff08;含&#xff1a;Ribbon、Feign&…

工厂机械臂人员闯入自动预警

工厂机械臂人员闯入自动预警系统通过yolov8系列网络模型深度学习算法&#xff0c;工厂机械臂人员闯入自动预警算法实时监测工作区域内的人员位置和机械臂设备的运行状态&#xff0c;实现对人员闯入的识别和预警。一旦系统检测到人员闯入作业区域&#xff0c;立即发出警报并同步…

java八股文面试[多线程]——什么是线程安全

对线程安全的理解 总结&#xff1a;一个进程内的多个线程同时访问堆内存。 知识来源&#xff1a; 【并发与线程】对线程安全的理解_哔哩哔哩_bilibili

Linux 多线程基础

文章目录 前言一、多线程基础函数1. pthread_create2. pthread_self3. pthread_exit4. pthread_join5. pthread_cancel6. pthread_detach 二、线程间的共享数据三、多线程 &#xff0c;进程对比总结 前言 一、多线程基础函数 1. pthread_create 创建新的线程。 #include <…