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

news2024/10/7 6:44:44

一、说明

        一般来说,界面开发中,如果不是大型的软件,就不必用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/939486.html

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

相关文章

JavaSE(下)

一、集合进阶 双列集合Map<>【Java】Map集合概述 双列集合特点 Map常见API 三种遍历方式 1、由键找值,创建键的集合 2、通过键值对对对象进行遍历 3、利用lambda表达式进行遍历 HashMap HashMap的特点 HashMap的底层 总结 例题 package com.itheima.Mapdemo;import java.…

探索音视频出海的无限可能|中企出海领袖班第八期成功举办

​近年来&#xff0c;音视频社交出海赛道的热度吸引了众多企业纷纷进军海外市场。然而&#xff0c;面对复杂多变的海外市场&#xff0c;无论是产品的本地化策略&#xff0c;还是对海外网络环境的适应以及网络安全防御等因素&#xff0c;都成为决定产品能否在海外市场脱颖而出的…

Error while validating pooled Jedis object.

如何处理 jedis得连接池得异常&#xff0c;顺着找到Jedis的工厂类JedisFactory&#xff0c;对应看下这两个方法的实现&#xff0c;熟悉的代码找到了&#xff0c;可疑的点也找到了&#xff1a; public boolean validateObject(PooledObject<Jedis> pooledJedis) {final Bi…

widnows 制作winpe启动盘

下载 官网 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 点击装机版&#xff0c;进行下载&#xff0c;等待下载完成 安装 解压 双击exe运行 插入u盘 识别到的u盘 点击【一键制作成usb启动盘】 点击确定&#xff0c;等待制作完成 重启电脑&#xff0c;选择从…

问道管理:市盈率市净率两个指标含义怎么算?

市盈率和市净率是出资领域常用的两个目标&#xff0c;用于评价公司的估值和出资的报答状况。本文将从多个视点剖析这两个目标的含义和计算方法&#xff0c;帮助读者更好地了解和运用它们。首先&#xff0c;市盈率&#xff08;P/E ratio&#xff09;是用来衡量公司股票价格与每股…

【Win10安装NVIDIA驱动、CUDA、CUDNN】

Win10安装NVIDIA驱动、CUDA、CUDNN 1 NVIDIA驱动下载2 下载CUDA2.1 查看CUDA版本2.2 下载并安装CUDA 3 下载并安装CUDNN3.1 输入账号和密码后&#xff0c;登录CUDNN官方网站进行下载3.2 安装3.2.1 解压下载的压缩包3.2.2 将解压后bin目录的内容全部放到CUDA对应的bin目录3.2.3 …

银河麒麟V10(Tercel)服务器版安装 Docker

一、服务器环境 ## 查看系统版本&#xff0c;确认版本 cat /etc/kylin-release Kylin Linux Advanced Server release V10 (Tercel)## 操作系统 uname -p aarch64## 内核版本&#xff08;≥ 3.10&#xff09; uname -r 4.19.90-21.2.ky10.aarch64## iptables 版本&#xff08;…

基于JavaFX的贪吃蛇小游戏

游戏背景介绍 贪吃蛇游戏是一款经典的小游戏&#xff0c;它的玩法很简单&#xff0c;就是控制蛇吃食物&#xff0c;每吃一个食物蛇的长度就会加一&#xff0c;直到蛇撞到墙壁或者撞到自己时游戏结束&#xff0c;最终的得分是蛇的长度减一。 JavaFX 用Java开发桌面端首选就是J…

姿态角 IMU 地磁

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录 阅读前请看一下&#xff1a;我是…

Fedora Linux 的家族(一):官方版本

导读本文将对 Fedora Linux 官方版本进行更详细的介绍。共有五个 版本&#xff1a; Fedora Workstation、Fedora Server、Fedora IoT、Fedora CoreOS 和 Fedora Silverblue。Fedora Linux 下载页面目前显示其中三个为 官方 版本&#xff0c;另外两个为 新兴 版本。本文将涵盖所…

计算机毕设 基于深度学习的图像超分辨率重建 - opencv python cnn

文章目录 0 前言1 什么是图像超分辨率重建2 应用场景3 实现方法4 SRResNet算法原理5 SRCNN设计思路6 代码实现6.1 代码结构组织6.2 train_srresnet6.3 训练效果 7 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少…

1.4 编写简易ShellCode弹窗

在前面的章节中相信读者已经学会了使用Metasploit工具生成自己的ShellCode代码片段了&#xff0c;本章将继续深入探索关于ShellCode的相关知识体系&#xff0c;ShellCode 通常是指一个原始的可执行代码的有效载荷&#xff0c;攻击者通常会使用这段代码来获得被攻陷系统上的交互…

市值暴跌后,每日优鲜能否靠2亿融资“续命”?

濒临破产退市的每日优鲜&#xff0c;靠转型实现“自救”&#xff1f; 作为“生鲜电商第一股”&#xff0c;每日优鲜在上市1年后爆发生存危机。 8月4日&#xff0c;每日优鲜(NDAQ:MF)公布了2022年报&#xff0c;尽管去年7月其宣布关闭营收占比约90%的DWM业务&#xff0c;全面终…

每日一题——柱状图中最大的矩形

柱状图中最大的矩形 题目链接 用什么数据结构&#xff1f; 要得到柱状图中最大的矩形&#xff0c;我们就必须要知道对于每一个高度heights[i]&#xff0c;他所能勾勒出的矩形最大是多少&#xff08;即宽度最大是多少&#xff09;。 而对应到图上我们可以知道&#xff0c;要知…

vue naive ui 按钮绑定按键

使用vue (naive ui) 绑定Enter 按键 知识点: 按键绑定Button全局挂载使得message,notification, dialog, loadingBar 等NaiveUI 生效UMD方式使用vue 与 naive ui将vue默认的 分隔符大括号 替换 为 [[ ]] <!DOCTYPE html> <html lang"en"> <head>…

助力养殖行业数字化转型,基于深度学习模型开发构建牛脸识别系统

在我们以往接触到的项目或者是业务场景中&#xff0c;大多牵涉到生物特征识别的任务基本都是人脸识别&#xff0c;这也是目前我们每天都会接触到的应用&#xff0c;比如&#xff1a;上下班的打卡、支付时的刷脸等等&#xff0c;这也是比较成熟的一项AI应用。 这里我们简单对一…

用智能汽车完成自救,高通的光明与暗夜!

这几年国产汽车的在智驾驶的发力&#xff0c;无疑受到了各行各业的瞩目&#xff0c;汽车智能化已经逐步走进大众视野。 我们之前阐述过高通在3C数码领域的见解与财报预测&#xff0c;随着第三财季的业绩报告显示&#xff0c;可以看到的是智能手机、IoT 市场的低迷让高通的营收…

C#调用barTender打印标签示例

使用的电脑需要先安装BarTender 我封装成一个类 using System; using System.Windows.Forms;namespace FT_Tools {public class SysContext{public static BarTender.Application btapp new BarTender.Application();public static BarTender.Format btFormat;public void Q…

vivado复制工程后如何修改路径

在 vivado 工程复制之后&#xff0c;直接打开项目&#xff0c;会发现所有文件都指向原工程&#xff0c;这个问题困扰了我好久&#xff08;之前都是项目中 remove 之后再一个一个重新添加&#xff0c;特别麻烦&#xff09;。然而前几天突发奇想试着把除 .srcs 文件夹之外的所有文…

大规模数据爬取 - 增量和分布式爬虫架构实战

嗨&#xff0c;亲爱的爬虫开发者们&#xff01;在当今的数据驱动时代&#xff0c;大规模数据的爬取对于许多领域的研究和应用至关重要在本文中&#xff0c;我将与你分享大规模数据爬取的实战经验&#xff0c;重点介绍增量和分布式爬虫架构的应用&#xff0c;帮助你高效地处理海…