欢迎光临散文网 会员登陆 & 注册

Python Tk GUI系列笔记(tkinter篇(初)) 第一章~第十章

2023-07-22 12:27 作者:水母山楂  | 我要投稿

〇、前言

此系列笔记主要介绍tkinter模块——Tk图形用户界面(GUI)及其相关内容

# 准确来说tkinter在Python中是一个包

编辑时内容包括:

tkinter、tkinter包内的部分模块、tkinter.ttk模块、ttkbootstrap、pystray模块和PIL库中的

ImageTk模块

内容参考以下网站:

TkDocs:https://tkdocs.com/(前四十一章)

C语言中文网:http://c.biancheng.net/tkinter/(前三十一章)

Python tkinter(GUI编程)模块最完整教程(上/中/下:(前四十一章)

https://blog.csdn.net/qq_48979387/article/details/125706562

https://blog.csdn.net/qq_48979387/article/details/125806479

https://blog.csdn.net/qq_48979387/article/details/125768994

Python tkinter一些十分灵活的运用方式和实用函数:(第四十二章)

https://blog.csdn.net/qq_48979387/article/details/119695934

tkinter.ttk --- Tk 风格的控件

https://docs.python.org/zh-cn/3.11/library/tkinter.ttk.html(33~41章)

Tcl/Tk文档:

https://www.tcl.tk/man/tcl8.6/TkCmd/contents.html前四十二章

ttkbootstrap:https://ttkbootstrap.readthedocs.io/en/latest/zh/(43~53章)

其他参考会在章节前列出

操作系统Windows 7

Python版本在二十三章前使用3.8版本,在二十三章及以后章节使用3.10版本

运行结果的窗口图片会缩放到80%,96 dpi

# gif录制软件:ScreenToGif

# 此系列的WPS笔记会在本系列的最后一个专栏中给出

颜色代表含义:

淡灰色:注释,一般前面有#

绿色:示例

橙色:拓展

紫色:示例中的input用户输入内容

红色、蓝色:突出或装饰文字作用

部分内容可能不严谨或者错误,欢迎指出

# 如果Python无tkinter可参考这篇专栏cv14759634

一、概述

# 以下内容摘抄自C语言中文网

· Tkinter(即tk interface)是Python标准GUI库,简称“Tk”;从本质上来说,它是对TCL/TK工具包的一种Python接口封装。Tkinter是Python自带的标准库,因此无须另行安装,它支持跨平台运行,不仅可以在Windows平台上运行,还支持在Linux和Mac平台上运行。

· Tkinter编写的程序,也称为GUI程序,GUI(Graphical User Interface)指的是“图形用户界面”,它是计算机图形学(CG)的一门分支,主要研究如何在计算机中表示图形,以及利用计算机进行图形的计算、处理和显示等相关工作

· 一个GUI程序一般由窗口、下拉菜单或者对话框等图形化组件构成,通过鼠标点击菜单栏、按钮或者弹出对话框的形式来实现人机互动,从而提升人机交互的体验,让“冰冷”的程序变得有“温度”


二、第一个Tkinter程序

一个Tkinter程序至少应包含以下四个部分:

(1)、导入tkinter模块

使用import语句或from...import...语句:

import tkinter [as 别名]

from tkinter import *

from tkinter import XXX

(2)、创建主窗口

主窗口也称root窗口(即根窗口):

创建tk模块中TK类的实例:tkinter.TK()

(3)、添加人机交互控件,同时编写相应的事件函数

这部分属于Tkinter编程的重点,人机交互控件例如菜单栏、按钮或者弹出对话框等等

(4)、通过主循环来显示主窗口

告诉Tkinter进入主循环,这是所有东西出现在屏幕上并允许用户与之互动的必要条件:

root.mainloop()  # root是TK类的实例

# 主循环也称“消息循环”或“事件循环”

示例1:  # 没有任何交互控件的Tkinter程序

运行结果:

 


示例2:  # 有文本和按钮交互控件的Tkinter程序

运行结果:

 


补充:宽度和高度对于大多数部件都是以像素为单位,而对于文本的部件是以字符为单位

补充:pythonw.exe(让程序独立运行在Windows环境下)

Python的安装目录里有python.exe和pythonw.exe两个程序:

python.exe运行程序时会弹出CMD窗口

pythonw.exe运行程序时无窗口,代码在后台执行

可以使用pythonw.exe运行程序使程序独立运行在Windows环境下而不受Python解释器的影响(这里的不受影响是指不像python.exe运行的那样解释器关闭GUI程序也关闭)

扩展名为.py的文件默认使用python.exe运行,扩展名为.pyw文件默认使用pythonw.exe运行


三、重要的Tk概念

(1)、控件/部件/组件(widget)

Tkinter用户界面是由一个个控件组成的。每个控件都由相应的Python对象表示,由ttk.Frame,ttk.Label以及ttk.Button这样的类来实例化

# ttk是tkinter中的一个模块,实现Tk风格的控件

(2)、控件层级结构(widget hierarchy)

控件按层级结构来组织。标签和按钮包含在框架中,框架又包含在根窗口中。当创建每个子控件时,它的父控件会作为控件构造器的第一个参数被传入

(3)、配置选项/控件属性/属性项(configuration options)

控件具有属性,属性会改变控件的外观和行为。不同的控件类会具有不同的属性集

(4)、几何管理/布局管理(geometry management)

小部件在创建时不会自动添加到用户界面。通过几何管理器控制这些小部件在用户界面的位置

(5)、事件循环/主循环/消息循环(event loop)

只有主动运行一个事件循环,Tkinter才会对用户的输入做出反应,改变你的程序,以及刷新显示。如果你的程序没有运行事件循环,你的用户界面不会更新

# 这些概念的译名后文会分别使用:控件、控件层级结构、控件属性/属性/属性项、布局管理、事件循环/主循环

# 在后面章节很少用到widget hierarchy这个概念

# configuration options一开是使用的Python官方文档译名:配置选项/选项,但因为网上和GUI编程中以控件属性作为译名,所以此后面章节以控件属性/属性/属性项作为译名


四、控件属性的获取和设置

(1)、configure(cnf=None, **kw)/config(cnf=None, **kw)

这是控件的两个方法,它们是完全等价的,功能如下:

设置控件的属性,属性的值通过关键字传参

如果不带参数调用方法,返回值是一个字典,键是字符串格式的控件允许的属性名。对于属性简写键(例如bg,是'background'的简写)的值是一个二元组:(属性简写, -属性全称);对于属性全称键的值是一个五元组,各索引含义如下:

0:属性名称

1:数据库查找的属性名称

2:数据库查找的属性类

3:默认值

4:当前值

cnf——configuration的缩写,是将控件属性名称映射到值的字典,这将设置对应属性的当前值;或是一个字符串,这类似于将字符串作为键获取字典的值,但是对于属性简称键会获取属性全称键的值

示例:

运行结果:

('bg', '-background')

('background', 'background', 'Background', <string object: 'SystemButtonFace'>, 'SystemButtonFace')

('background', 'background', 'Background', 'SystemButtonFace', 'SystemButtonFace')

['bd', 'borderwidth', 'class', 'menu', 'relief', 'screen', 'use', 'background', 'bg', 'colormap', 'container', 'cursor', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'padx', 'pady', 'takefocus', 'visual', 'width']

 


(2)、keys()

控件的一个方法,功能如下:

返回控件所有属性名称的列表

# 找出控件特有属性时可将属性列表与更简单的控件(如框架Frame)的列表进行比较

# 同样找出控件特有方法可使用dir()作比较

示例:

运行结果:

['bd', 'borderwidth', 'class', 'menu', 'relief', 'screen', 'use', 'background', 'bg', 'colormap', 'container', 'cursor', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'padx', 'pady', 'takefocus', 'visual', 'width']

{'use', 'menu', 'screen'}

66

(3)、设置控件的属性

1.在对象创建时,使用关键字

自定义变量 = 控件类(控件属性=值, 控件属性=值, ...)

2.在对象创建后,将参数名用作字典索引

自定义变量[控件属性] = 值

3.利用configure()或config()方法修改对象的多个属性

自定义变量.configure(控件属性=值, 控件属性=值, ...)

(4)、关于后文对控件属性的介绍

文档内的介绍控件的属性时,因为控件既有相同的属性(功能近似或相同),也有不同的。所以介绍时会在每章节的属性项小节开头列出所有的控件属性,所有的控件属性整个文档都只会介绍一遍,除非有区别

同一控件列出的默认值都是对于控件自身来说的,其他控件的默认值会有不同,所以介绍过的控件属性会在小节最后列出默认值和注意事项(在后面章节没介绍的也会列出)

# 在介绍时没列出默认值的一般是无默认值

控件中没有列出的属性,对当前控件无效果或不常用

# 这里的“没有列出的属性”指的是既没在当前控件中说明又没在后面列出默认值的属性

# 对当前控件无效果的控件也可能在列出默认值后面说明

# 不止控件有属性,布局管理器和控件中的对象(像Canvas中的画布对象)也有属性

# 布局管理器的属性介绍会在后面重复介绍


五、布局管理器

(1)、概念

布局管理器(或形状管理器, Geometry Manager)用于指定多个控件在窗口(共同的主控件)内的相对位置,从而实现对窗口和控件布局的目的

# 以下三个布局管理器都是tkinter模块的类,控件类继承自它们,有它们的所有方法

(2)、Pack

Pack是一种较为简单的布局管理器,按添加顺序排列控件。与Place相比,Pack可接受定性的相对关系——上面、左面、填充等,并确定精确的位置坐标

# 父控件的大小都由其内部的子控件大小决定(除非父控件调用pack_propagate(False))

补充:如果控件2比控件1后被实例化,则控件2图层在控件1之上

# 修改堆叠顺序见lower()和tkraise()方法

1.pack(cnf={}, **kw)

# 别名:pack_configure, configure, config

# 可通过别名调用此方法,其中configure, config在Pack实例中调用是此方法,在其他控件中调用是控件对应设置控件属性的方法

将子控件包装到父控件,属性如下:

# 使用关键字传参

anchor:控件在窗口中的对齐方式,值必须是'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'或'center'。

'center'是默认值

# e w s n分别表示东西南北,center表示中间

after, before:值必须是一个调用过pack()的控件,被调用的控件将会在传入值的控件之前/之后进行包装

expand:值为True则在父控件大小增加时,扩展子控件;值为False(默认值)则不扩展

fill:值为'x', 'y', 'both', 'none'。'x', 'y', 'both'分别表示允许控件在水平/垂直/同时两个方向进行拉伸,'none'(默认值)表示不允许控件进行拉伸

# 传入内置常量None等同于字符串'none'

in, in_:指定包装到的父控件,默认为主窗口

# 因为in是关键字,所有关键字传参时用in_,使用cnf设置时用in或in_

# 这里“父控件”只是在包装中的父控件,而不是真正的父控件。这可能会造成包装后由于子控件堆叠顺序低而不显示在屏幕上,所以建议包装在控件中的都应为它的子控件

ipadx, ipady:指定子控件边框和内容之间的距离(内边距),分别是水平和垂直,默认值都为0,单位是像素

padx, pady:指定子控件边框周围的空间(外边距),分别是水平和垂直,默认值都为0,单位是像素。如果值是一个有两个值的列表,则这两个值分别指定控件两边的外边距(左边和右边、上边和下边)

# 这里的ipadx, ipady, padx, pady指定的值是每一侧的距离

side:子控件放置在父控件的位置,值为'top', 'bottom', 'left', 'right',分别是顶部/底部/左边/右边

cnf——将属性名称映射到值的字典

补充:尺寸

控件的长度、宽度和其他尺寸不仅可以用整数来描述:

如果尺寸是一个整数,则它被认为是以像素为单位

如果尺寸是一个浮点数,则它被认为是以像素为单位并四舍五入

如果尺寸是一个字符串,则它需要是以下形式:

'<整数/浮点数><单位>'

其中单位有:

c:厘米

i:英寸

m:毫米

p:打印分辨率(1/72英寸)

尺寸最后都将被转换为像素(通过dpi)

# 该文档没特殊说明的有关长度、宽度或其他尺寸的设置都适用

# 一些地方如果尺寸设置为负,则代表最小尺寸

示例:

运行结果:

拉伸主窗口前:

 


手动拉伸主窗口后:


2.pack_info()

# 别名:info

以字典形式返回关于控件的包装属性的值,控件被包装后才可调用,否则引发_tkinter.TclError

3.pack_forget()

# 别名:forget

解除子控件被包装到父控件,忽略原有设置

# 下面两个方法应由父控件调用

4.pack_propagate(flag=['_noarg_'])

# 别名:propagate

设置父控件是否会自动调节尺寸以容纳所有子控件,默认为True。不带参数调用此方法则返回当前设置

5.pack_slaves()

# 别名:slaves

以列表形式返回父控件的所有被包装的子控件,按其包装顺序排列

# Pack具体工作过程见https://tcl.tk/man/tcl8.6/TkCmd/pack.htm中的“THE PACKER ALGORITHM”

(3)、Grid

Grid是一种基于网格式的布局管理器,按行列形式排列控件

1.gird(cnf={}, **kw)

别名:grid_configure, configure, config

将子控件以行列形式排列到父控件,属性如下:

# 使用关键字传参

column:控件插入的列。窗体最左边的为起始列(第0列),默认值为第0列

row:控件插入的行。窗体最上面的为起始行(第0行),默认值为当前最大行的下一行

columnspan:控件所跨的列数。默认值为1

rowspan:控件所跨的行数。默认值为1

# columnspan和rowspan会覆盖所跨的单元格

sticky:通过E, W, S, N组合的字符串来定位子控件在单元格的位置(子控件附在单元格边界上),默认值为空字符串(居中)

# E, W, S, N大小写均可以

ipadx, ipady, padx, pady:同Pack,默认值都为0

cnf——将属性名称映射到值的字典

示例1:  # 打印九九乘法表

运行结果:

示例2:  # 演示跨行/列

运行结果:

补充:

同一个控件连续调用两次布局管理器,第二次指定的值会替代第一次指定的值,没指定的继续使用第一次指定的值

同一个父控件Pack和Grid布局管理器不能同时使用

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

# 别名:bbox

# 由父控件调用

返回一个4元组描述父控件内一些或全部子控件的边界大小:

(列坐标, 行坐标, 宽度, 高度),前两个数指定父控件中左上角的偏移量(也就是一个点的坐标),后两个数指定了宽度和高度(向右和下延伸)

如果没给出参数,则返回的参数是描述全部单元格的边界大小

如果给出column和row,则返回的参数是描述指定坐标的单元格的边界大小

如果给出column, row, col2, row2则返回参数是描述(column, row)单元格到(col2, row2)单元格的边界大小

传入的参数都是坐标(可以是负的),返回的值都是以像素为单位

# 因为Tkinter在屏幕上绘制控件之前不会计算坐标,所以在主循环启动后或调用此方法之前调用主窗口root的root.update()方法强制绘制窗口才能得到结果

示例:

运行结果:

(0, 0, 250, 250)

(200, 200, 50, 50)

(100, 100, 150, 150)

(0, 100, 100, 150)

3.grid_info()

# 别名:info

以字典形式返回关于控件的Grid属性的值,控件调用grid()前调用此函数返回空字典

4.grid_forget()

# 别名:forget

解除子控件被排列到父控件,忽略原有设置

5.grid_propagate(flag=['_noarg_'])

# 别名:propagate

同Pack.pack_propagate()

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

# 别名:slaves

以列表形式返回父控件指定行列的所有被包装的子控件,按其包装顺序排列。参数值为None代表任意行列

7.grid_size()

# 别名:size

返回网格大小的二元组:(列数, 行数)

8.grid_remove()

解除子控件被排列到父控件,记住原有设置

9.grid_location(x, y)

# 别名:location

返回位于给定坐标(x, y)的网格位置(x, y单位都是像素),返回值是一个二元组:(列, 行)

# 此方法不用在主循环或root.update()之后使用

10.grid_rowconfigure(index, cnf={}, **kw)

# 别名:rowconfigure

如果给出属性项,则设置指定行index的属性;否则获取指定行index的属性,属性项如下:

minsize:该行的最小高度,单位是像素,默认值为0

pad:该行中最大网格垂直边距,单位是像素,默认值为0

# 垂直边距是与上下两边的距离,如果值为奇数则优先与下边距离远

weight:该行占额外空间的权重,是一个整数,默认值为0

uniform:可以是任意值,同一控件的不同行如果有除None以外的相同值则将它们放在同一组中。为属于同一组的行按weight值分配空间,所以它们的大小始终与weight值严格成比例。默认值为None

cnf——同Pack.pack()

11.grid_columnconfigure(index, cnf={}, **kw)

# 别名:columnconfigure

如果给出属性项,则设置指定列index的属性;否则获取指定列index的属性,属性项如下:

minsize:该列的最小宽度,单位是像素,默认值为0

pad:该列中最大网格水平边距,单位是像素,默认值为0

# 水平边距是与左右两边的距离,如果值为奇数则优先与右边距离远

weight:该列占额外空间的权重,是一个整数,默认值为0

uniform:同Grid.grid_rowconfigure()

cnf——同Pack.pack()

示例:

运行结果:

(4)、Place

Place进行布局管理更加精细化,可以直接指定控件在窗体内的绝对位置,或者相对于其他控件定位的相对位置,也可以指定控件的大小

# Place布局管理器不会自动调节父控件的大小

1.place(cnf={}, **kw)

# 别名:place_configure, configure, config

将子控件定位到父控件,属性如下:

# 使用关键字传参

in, in_:指定定位到的父控件,默认为主窗口

anchor:在子控件内的锚点位置,值必须是'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'或'center'。'nw'是默认值

x, y:子控件相对于锚点水平和垂直偏移位置,单位是像素,默认值都为0

relx, rely:子控件相对于父控件的水平和垂直位置,默认值都为0

# 同时指定x, relx/y, rely,relx/rely优先生效,再根据x/y相对于生效后锚点偏移

width, height:控件的宽度和高度,单位是像素,默认值都为空字符串,表示控件设置

relwidth, relheight:子控件相对于父控件的宽度和高度,默认值都为空字符串

# 同时指定width, relwidth/height, relheight,relwidth/relheight优先生效,再加上width/height指定的宽度/高度。width/height可以是负数,在这里代表减去的值而不是最小宽度/高度

# relx, rely, relwidth, relheight为1.0分别表示右边、底边、相同宽度和相同高度

# relx, rely, relwidth, relheight可以大于1.0或为负数。relwidth, relheight为负数相当于为0.0,大于1.0是父控件宽度和高度的倍数;relx, rely为负数则位置向左,大于1.0是父控件水平和垂直位置的倍数

bordermode:子控件定位时,是否考虑父控件的的边框,'inside'(默认值)是不考虑,'outside'或'ignore'是考虑

# 例如Label控件指定highlightthickness设置高亮边框宽度

# Canvas控件指定highlightthickness设置的高亮边框总会被考虑

# 关于该属性进一步的详细介绍见https://tcl.tk/man/tcl8.6/TkCmd/place.htm

cnf——将属性名称映射到值的字典

# 无参数调用此方法不会将子控件定位到父控件


示例1:

运行结果:

拉伸前:

横向拉伸后:

示例2:


运行结果:

2.place_info()

# 别名:info

以字典形式返回关于控件的Place属性的值,控件调用place()前调用此函数返回空字典

3.place_forget()

# 别名:forget

解除子控件被定位到父控件,忽略原有设置

4.place_slaves()

以列表形式返回父控件的所有被定位的子控件,按其包装顺序排列

补充:Tkinter中的坐标系

以左上角为原点(0, 0),X坐标向右增加,Y坐标向下增加。基本单位是像素

补充:Place布局管理器和其他布局管理器共用

Place布局管理器可以和Pack布局管理器或Grid布局管理器共用。共用时要注意控件的堆叠顺序以防一个控件遮盖另一个控件

示例:

运行结果:

补充:tkinter模块中的常量

tkinter模块中有一些像E, DISABLED, BOTH这样的常量,它们的值都是常量名对应的字符串,方便传参

在tkinter.constants模块中可以查看,下面列出其中所有的常量

布尔值:

NO=FALSE=OFF=0

YES=TRUE=ON=1

用于anchor和sticky:

N, S, W, E, NW, SW, NE, SE, NS, EW, NSEW, CENTER

用于fill:

NONE, X, Y, BOTH

用于side:

LEFT, TOP, RIGHT, BOTTOM

用于relief:

RAISED, SUNKEN, FLAT, RIDGE, GROOVE, SOLID

用于orient:

HORIZONTAL, VERTICAL

用于tabs:

NUMERIC

用于wrap:

CHAR, WORD

用于align:

BASELINE

用于bordermode:

INSIDE, OUTSIDE

特殊标签、标记和插入位置:

SEL, SEL_FIRST, SEL_LAST, END, INSERT, CURRENT, ANCHOR, ALL

文本控件和按钮控件的状态:

NORMAL, DISABLED, ACTIVE

画布控件的状态:

HIDDEN

菜单项类型:

CASCADE, CHECKBUTTON, COMMAND, RADIOBUTTON, SEPARATOR

列表框的选择模式:

SINGLE, BROWSE, MULTIPLE, EXTENDED

列表框active line样式:

NONE, DOTBOX, UNDERLINE

画布的各种样式:

PIESLICE, CHORD, ARC, FIRST, LAST, BUTT, PROJECTING, ROUND, BEVEL, MITER

用于xview, yview:

MOVETO, SCROLL, UNITS, PAGES


六、主窗口(Tk)与控件对象部分方法

(1)、构造方法

tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)

构造一个最高层级的Tk控件,这通常是一个应用程序的主窗口,并为这个控件初始化Tcl解释器。每个实例都有其格自所关联的Tcl解释器

# Tk类通常全部使用默认值来初始

className——控件类的名称。会被用作预置文件同时也作为Tcl发起调用的名称,默认值为'Tk'

# 会被用作窗口的标题

# 参数具体说明见https://docs.python.org/zh-cn/3.12/library/tkinter.html

(2)、属性项

bd, borderwidth, class, menu, relief, screen, use, background, bg, colormap, container, cursor, height, highlightbackground, highlightcolor, highlightthickness, padx, pady, takefocus, visual, width

# colormap, visual属性分别是颜色映射和框架显示,大部分取值是针对过去低端的显示设备,这里不详细说明

# menu属性在Menu控件中说明

# class属性在“属性项数据库”章节中说明

# use属性将在Toplevel控件中说明

1.background或bg

指定控件的背景颜色,默认值由系统指定,为防止更新可设置为空字符串

补充:颜色

在Tkinter中一般有两种方法来指定颜色

1.颜色的十六进制数,即红、绿、蓝三种颜色不同比例的混合色:

#rgb:每种颜色四位

#rrggbb:每种颜色八位

#rrrgggbbb:每种颜色十二位

# 十六进制字母小写大小都可以

2.本地定义的标准颜色名称:

'white', 'black' 'red', 'green', 'blue', 'cyan', 'yellow'和'magenta'颜色名称始终可用。其他颜色名称取决于本地环境

# 'green'对应的十六进制数是#008000,'green1'对应的十六进制数是#00ff00

# 其他颜色名称见https://tcl.tk/man/tcl8.6/TkCmd/colors.htm

2.width, height

指定控件的宽度和高度,文本控件以字符为单位,其他控件以像素为单位,默认值为0

3.relief

指定控件的边框样式(3D效果),参数值为'flat'(平的), 'raised'(凸起的), 'sunken'(凹陷的), 'groove'(沟槽桩边缘), 'ridge'(脊状边缘), 'solid'(实心),默认值为'flat'

浏览图如下:

4.borderwidth或bd

指定控件的边框宽度,单位是像素,默认值为0

# 边框样式只有在边框宽度不为0是才能显示


5.highlightthickness

指定控件的高亮边框的宽度,单位是像素,默认值为0

# 高亮边框就是当控件有焦点时围绕在周围的矩形

6.highlightcolor

当控件获得焦点时高亮边框的颜色,默认值由系统指定

7.highlightbackground

当控件没获得焦点时高亮边框的颜色,默认值由系统指定

示例:  # 高亮边框的示例

运行结果:

有焦点:

无焦点:

8.cursor

当鼠标移动到控件上时的鼠标样式,可选值参见:

https://tcl.tk/man/tcl8.6/TkCmd/cursors.htm

https://tkdocs.com/shipman/cursors.html  # 具体显示由操作系统决定

举例:arrow(箭头), plus(加号), crosshair(十字线), fleur(十字花), watch(待加载圆圈), xterm(输入光标), X_cursor(X型光标)

# 不区分大小写

9.takefocus

当值为1时,焦点可以通过TAB键移动到控件上;否则当值为0时,焦点不可以通过TAB键移动到控件上。默认值为0

10.screen

指定放置新窗口的屏幕。任何有效的屏幕名称都可使用

(3)、部分方法

# 这里即包括控件对象共有的方法,又包括窗口控件的方法,所以非常多

# 如果只是想看主窗口控件的方法,可以从83个方法开始。或是跳过此章节剩余部分,先查看后面的几个控件再从这里开始。或是直接从这里开始查看不跳过(个人在编写的时候是先编写这些方法的)

# 有些方法或方法的参数牵连到其他知识,会只写出而不做具体介绍

1.report_callback_exception(exc, val, tb)

将回调而引发的异常输出到sys.stderr

# 需要自定义可将另一个3个参数的函数赋值给此函数

以下是全局方法,这些方法适用于所有控件,但在全局范围内有效,而不是作用于单个控件。按照惯例,应由主窗口控件调用

2.bell(displayof=0)

鸣响displayof所在的显示器的震铃,默认使用应用的主窗口的显示器

# '.'表示主窗口

3.deletecommand(name)

删除name中提供的Tcl命令,name是一个字符串

# str(widget)返回控件的name

4.getboolean(s)

返回一个布尔值

s——是一个字符串。如果是'0', 'false', 'no'或'off'中的任何一个,则返回False;如果是'1', 'true', 'yes', 'on'中的任何一个,则返回True。这些值都可以缩写(除了'o')且不区分大小写

# 虽然s也可以是数值类型

5.getint(s)

返回一个十进制整数

s——是一个字符串。前后可以留空白,可以带符号,在空白和符号之后的字符为'0x'则为十六进制、'0o'或'0'则为八进制形式、'ob'则为二进制形式

6.getdouble(s)

返回一个浮点数

s——是一个字符串。形式:[空白][符号][数字]['.'数字]['e'[符号]数字][空白]

7.setvar(name='PY_VAR', value='1')

设置Tcl变量name的值value

8.getvar(name='PY_VAR')

返回Tcl变量name的值

9.mainloop(n)

事件循环,直到所有窗口被关闭

n——当主窗口数量下降到n时退出事件循环并继续执行代码

示例:

运行结果:

开始事件循环

# 出现5个窗口

# 关到剩3个窗口时,3个窗口未响应

结束事件循环

# 五秒后

执行结束

# 3个窗口被关闭

10.quit()

退出Tcl解释器。所有控件都将被销毁

11.nametowidget(name)

返回名为name的控件

name——是一个字符串或控件

# name如果传入控件则返回控件本身

# 也就是返回控件的标识符

12.after(ms, func=None, *args)

等待毫秒ms后调用func并使用args作为传入的位置参数。返回用于after_cancel()取消调度的标识符

# 此方法在调用时就直接返回并开始计时,事件循环时才调用函数

13.after_idle(func, *args)

如果Tcl主循环没有事件需要处理,就调用func并使用args作为传入的位置参数。返回用于after_cancel()取消调度的标识符

14.after_cancel(id)

取消标识符id的函数的调度

15.clipboard_get(**kw)

读取并返回剪贴板的内容,可选关键字参数如下:

displayof:读取指定displaypf所在的显示器上的剪贴板,默认值为Tkinter的主窗口

type:指定返回数据的形式,是一个原子名称,默认值为'STRING',详情参见客户间通信协定手册(ICCCM)

# 在X11上,默认值先尝试'UTF8_STRING',失败后退回'STRING'

此方法相当于:

selection_get(selection='CLIPBOARD')

# 如果剪贴框内容不存在或不是文本类型会引发TclError异常

16.clipboard_clear(**kw)

清空剪贴板中的内容,可选关键字参数如下:

displayof:同clipboard_get()

17.clipboard_append(string, **kw)

将string追加到剪贴板中,可选关键字参数如下:

displayof, type:同clipboard_get()

format:指定用来把选择传输到请求者的表示法,默认值为'STRING'

# 追加前会清空剪贴板中的内容,且在调用mainloop()时才真正添加到剪贴板

18.tk_bisque()

将颜色方案改为Tk 3.6及以前使用的浅棕色

19.tk_focusFollowsMouse()

鼠标下的控件会自动获得焦点。不容易被禁用

# 需要主窗口先得到焦点,且控件的takefocus选项不为False或0

示例:

运行结果:

# 焦点在其中一个输入框,并能直接输入文本

20.tk_focusNext()

21.tk_focusPrev()

返回当前拥有焦点的控件的焦点顺序的下一个/上一个控件

焦点顺序首先到下一个子控件,然后递归到子控件的子控件,然后到堆叠顺序中的下一个同级控件。如果控件的takefouces属性设置为0,则它被忽略

# 后创建的控件堆叠在先创建控件的上面

# 设置控件的堆叠顺序见lower()和tkraise()方法

22.tk_setPalette(*args, **kw)

为所有控件设置一个新的颜色方案

如果只传入一个参数,则这个参数是用来设置背景颜色

如果传入多个参数,则参数的个数必须是偶数个,每两个参数的第一个指定属性名称,第二个指定颜色(属性的新值)

如果传入序列,则将序列扁平化(转成一维)后将每个元素作为位置参数

此外可以使用关键字传参,键是属性名称,值是指定颜色

调用此方法,必须有一个是设置背景颜色

支持以下属性名称:

activeBackground, foreground, selectColor, activeForeground, highlightBackground, selectBackground, background, highlightColor, selectForeground, disabledForeground, insertBackground, troughColor

示例:


运行结果:

有焦点:

无焦点:

23.tk_strictMotif(boolean=None)

设置Tcl内置变量tk_strictMotif的值,外观和感觉是否遵循Motif,默认值为0。值为1意味坚持Motif(例如鼠标经过滑块不会改变颜色)

返回设置后的值。如果没传入参数,则返回当前值

24.update()

进入事件循环,直到所有待处理的事件都被Tcl处理完毕

25.update_idletasks()

进入事件循环,直到所有的空闲回调都被调用。这将更新窗口的显示,但不处理由用户引起的事件

# 空闲回调是after_idle()方法

# 与update()的区别是只会处理空闲回调,像控件包装之类的不会处理

示例:

运行结果1:

func()被调用

运行结果2  # 将14行改为root.update_idletasks()

func()被调用

26.wait_variable(name='PY_VAR')

# 别名:waitvar

阻塞,直到变量name被修改

# 阻塞时会进行主循环,变量name是Tcl变量

27.wait_visibility(window=None)

阻塞,直到控件window的可见性发生变化。如果没给出参数则使用self

# 实测当控件所处窗口最大化,最小化和控件出现时会结束等待

28.wait_window(window=None)

阻塞,直到控件window被销毁。如果没给出参数则使用self

# 调用控件的destroy()方法销毁控件

# 后文所说的调用控件指调用方法的控件

 

以下方法继承自父类Misc,所有控件都可调用

29.cget(key)

以字符串形式返回控件属性key的值

30.configure(cnf=None, **kw)

# 别名:config

见四、(1)

31.destroy()

销毁调用的控件和它的子控件

32.keys()

返回控件所有属性名称的列表

33.lower(belowThis=None)

将调用控件的堆叠顺序降到控件belowThis的下面

省略belowThis则将其堆叠顺序降到最低

34.tkraise(aboveThis=None)

# 别名:lift

将调用控件的堆叠顺序升到控件aboveThis的上面

省略belowThis则将其堆叠顺序升到最高

补充:堆叠顺序低的用TAB自动选择焦点时先被选择

补充:如果一个控件想要在另一个控件之上,包括使用布局管理器和控件自带方法,必须确保这个控件的堆叠顺序高于另一个控件,否则不会显示

# 子控件堆叠顺序总高于父控件


35.focus_get()

返回当前应用程序中拥有焦点的控件。如果应用程序没有焦点则返回None

36.focus_displayof()

返回调用控件所在显示器上拥有焦点的控件。如果应用程序没有焦点则返回None

37.focus_lastfor()

返回窗口激活后将获得焦点的控件。与focus_get()不同的是如果应用程序没有焦点也会返回拥有焦点后将获得焦点的控件

# 因为需要调用root.update()来更新窗口(让控件出现在窗口上),所以在没更新窗口之前调用此函数通常返回主窗口控件

38.focus_set()

# 别名:focus

将焦点指向调用控件。如果应用程序当前没有焦点,则一旦应用程序通过窗口管理器获得焦点,调用控件将获得焦点

39.focus_force()

将焦点指向调用控件,即使应用程序没有焦点。请谨慎使用!

40.grab_set()

将调用控件设置焦点抓取

如果设置焦点抓取,则在应用程序中只能操作焦点抓取的控件和它的子控件(所有事件只能在该控件处理)

# 实测同时只能一个控件设置焦点抓取

41.grab_set_global()

将调用控件设置全局焦点抓取。请谨慎使用——其他应用程序不会再得到事件

# 例如在多进程中,设置其中一个进程的一个控件全局焦点抓取,另一个进程的窗口不能再操作

42.grab_current()

返回当前应用程序中被焦点抓取的控件,如果没有则返回None

43.grab_status()

返回调用控件的焦点抓取状态:None, 'local', 'global'

44.grab_release()

释放控件焦点抓取

45.winfo_atom(name, displayof=0)

返回原子名称name的整数标识符。如果没有以name命名的原子存在,则新创建一个原子

displayof——在指定displaypf所在的显示器上寻找,默认值在主窗口的显示器上寻找

46.winfo_atomname(id, displayof=0)

返回整数表示符为id的原子名称,原子不存在会引发TclError

displayof:同winfo_atom()

47.winfo_children()

返回调用控件所有子控件的列表

48.winfo_parent()

返回调用控件父控件的名称,如果父控件是主窗口则返回空字符串

49.winfo_class()

返回调用控件的控件类名

# 像创建控件类的子类然后创建实例调用此方法会返回控件类名而不是子类名

# 主窗口控件的类名可在构建时传入className参数指定

50.winfo_containing(rootX, rootY, displayof=0)

返回位于电脑屏幕rootX, rootY的控件

displayof:同winfo_atom()


示例:

运行结果:

.!canvas

.!canvas2

.!canvas2

51.winfo_depth()

返回像素位深度(每个像素所用的位数)

52.winfo_exists()

如果调用控件存在则返回1,否则返回0

53.winfo_fpixels(number)

返回给定距离number(例如'3c')的像素值,是一个浮点数

54.winfo_pixels(number)

返回winfo_fpixels()的四舍五入指,是一个整数


55.winfo_geometry()

返回调用控件的geometry string:"widthxheight+X+Y"

# 未进入主循环前需要先调用root.update()来更新窗口(映射控件)

补充:geometry string

geometry string是描述桌面上顶层窗口的大小和位置的标准方式,形式如下:

'wxh±x±y'

其中x, ±都是字符,±表示'+'或'-'。有以下三种形式:

'wxh', '±x±y', 'wxh±x±y'

w, h:窗口的宽度和高度,单位是像素

x:如果为+x则是距离桌面左边有x个像素;如果为-x则是距离桌面右边有y个像素

y:如果为+y则是距离桌面上边有y个像素;如果为-y则是距离桌面下边有y个像素

56.winfo_width()

返回调用控件的宽度

57.winfo_height()

返回调用控件的高度

# 以上两个方法需要先映射控件,值会随着窗口的改变而更新

58.winfo_reqwidth()

返回调用控件的请求宽度

59.winfo_reqheight()

返回调用控件的请求高度

# 以上两个方法不需要先映射控件,值不会随着窗口的改变而更新

# 注意窗口控件调用返回的宽度和高度不包括窗口边框

60.winfo_rootx()

返回调用控件在桌面左上角的x坐标

61.winfo_rooty()

返回调用控件在桌面左上角的y坐标

62.winfo_x()

返回调用控件在窗口左上角的x坐标

63.winfo_y()

返回调用控件在窗口左上角的y坐标

64.winfo_id()

返回调用控件的标识符ID

65.winfo_interps(displayof=0)

返回displaypf所在的显示器上的所有Tcl解释器的名称

66.winfo_ismapped()

如果调用控件被映射(可见)则返回1,否则返回0

67.winfo_viewable()

如果调用控件和它的父控件都被映射则返回1,否则返回0

68.winfo_manager()

返回调用控件布局管理器的名称,无则返回空字符串

# 例如pack, grid, place,如果布局管理器是一个控件,则返回控件类的类名

69.winfo_name()

返回调用控件的名称

70.winfo_pathname(id, displayof=0)

返回给定ID的路径名称


71.winfo_pointerx()

72.winfo_pointery()

73.winfo_pointerxy()

如果鼠标指针与窗口在同一屏幕上,则分别是返回鼠标指针的x坐标、y坐标、(x坐标, y坐标)。如果不在同一屏幕上则返回-1

74.winfo_rgb(color)

返回颜色color的RGB色彩值。返回一个三元组,每个值在0和65535之间

75.winfo_server()

返回屏幕的服务器信息

76.winfo_toplevel()

返回调用控件的顶级窗口控件

77.winfo_screen()

返回与窗口相关的屏幕名称

78.winfo_screendepth()

返回与窗口相关的屏幕的像素位深度(每个像素所用的位数)

79.winfo_screenwidth()

返回与窗口相关的屏幕的宽度,单位是像素

80.winfo_screenheight()

返回与窗口相关的屏幕的高度,单位是像素

81.winfo_screenmmwidth()

返回与窗口相关的屏幕的宽度,单位是毫米

82.winfo_screenmmheight()

返回与窗口相关的屏幕的高度,单位是毫米

 

以下方法继承自父类Wm,只有Tk和Toplevel控件才可调用

# Wm是Window manager(窗口管理器)的缩写

83.wm_aspect(minNumer=None, minDenom=None, maxNumer=None, maxDenom=None)

别名:aspect

指示窗口管理器将调用控件的宽高比(宽度/高度)设置为minNumer / minDenom和maxNumer / maxDenom之间。如果都指定为空字符串,则原有限制将删除。如果没给出参数,则返回(minNumer, minDenom, maxNumer, maxDenom)(如果没有设置则返回None)

# 实测在Windows 7上无效果

84.wm_attributes(*args)

别名:attributes

返回或设置窗口各项平台特定属性

无参数调用会返回平台特定属性和其值的列表

一个参数调用需要参数是属性名称,会返回它的值

多个参数调用需要是偶数的参数,每两个参数的第一个是属性名称,第二个是设置的值

在Windows上的特定属性如下:

-alpha:窗口的不透明度,值为浮点数,值范围0.0(完全透明)~1.0(不透明)。如果值超过范围则小于0的会被设为0.0,大于1的会被设为1.0,默认值为1.0

-transparentcolor:设置穿透颜色(透明色),值为颜色,指定空字符串(默认值)则不使用

-disabled:窗口是否禁用,值为布尔值,禁用时无法在窗口上进行任何操作,默认值为0

-fullscreen:窗口是否全屏显示,值为布尔值,默认值为0

-toolwindow:窗口是否设置为工具窗口样式(窗口标题栏只剩关闭),值为布尔值,默认值为0

-topmost:窗口是否顶置,值为布尔值,默认值为0


示例:

运行结果:

('-alpha', 1.0, '-transparentcolor', '', '-disabled', 0, '-fullscreen', 0, '-toolwindow', 0, '-topmost', 0)

85.wm_iconify()

# 别名:iconify

将窗口图标化(最小化)

86.wm_deiconify()

# 别名:deiconify

取消窗口图标化,wm_iconify()的逆方法

87.wm_focusmodel(model=None)

# 别名:focusmodel

设置或获取焦点模式

'active'为控件将自己索取焦点

'passive'为窗口管理器将给予焦点

默认为'passive'。无参数调用返回当前焦点模式

88.wm_forget(window)

# 别名:forget

取消窗口window在屏幕上的映射,并wm将不会管理该窗口

Toplevel窗口不由wm管理时会被视为Frame窗口,menu属性项会被记住

89.wm_frame()

# 别名:frame

返回窗口的标识符(窗口句柄),是十六进制字符串

# 注意要在root.update()后获取才是目前的窗口句柄


90.wm_geometry(newGeometry=None)

# 别名:geometry

设置或获取窗口的geometry string,具体见winfo_geometry()。无参数调用则返回当前值

91.wm_iconbitmap(bitmap=None, default=None)

# 别名:iconbitmap

设置窗口图标为bitmap(.ico文件类型的路径或其他图标格式)

default——是一个图标文件路径,会将当前和后续所有没指定图标的窗口自动设置为此图标文件

# 实测default只能指定一次,否则图标将是.exe的图标。如果同时指定bitmap和default,则只有default生效。指定default之前没调用root.update()且有设置过图标会失效

补充:.ico图标格式  # 摘抄自https://zhuanlan.zhihu.com/p/181586990

.ico是一种图标格式,常见于windows的桌面图标和网址导航栏的小图标。主要特点是一个ICO文件可以包含多种尺寸图片

常见的尺寸有16px、24px、32px、48px、64px、96px、128px、192px、256px

win10新增支持更大尺寸512px、768px

需要做全尺寸的推荐256px*256px;不需要的按照使用场景设计

补充:标准位图

对于bitmap属性,这些位图始终可用:

# 图片来源:https://tkdocs.com/shipman/bitmaps.html

从左到右依次是:'error', 'gray12', 'gray25', 'gray50', 'gray75', 'hourglass', 'info', 'questhead', 'question', 'warning'

# 不同系统显示不同

示例:

运行结果:

 

92.wm_iconmask(bitmap=None)

# 别名:iconmask

设置或获取位图掩码

93.wm_iconname(newName=None)

# 别名:iconname

设置或获取当窗口图标化时的图标名称

94.wm_iconposition(x=None, y=None)

# 别名:iconposition

设置或获取当窗口图标化时的图标位置

95.wm_iconwindow(pathName=None)

# 别名:iconwindow

设置或获取当窗口图标化时的控件窗口

# pathName是用作图标的窗口,但有的窗口管理器不支持图标窗口概念

96.wm_sizefrom(who=None)

# 别名:sizefrom

设置或获取窗口尺寸是由who决定的

who——必须是'user'(用户)或'program'(系统)或它们的缩写

97.wm_positionfrom(who=None)

# 别名:positionfrom

设置或获取窗口位置是由who决定的

who——必须是'user'(用户)或'program'(系统)或它们的缩写


98.wm_iconphoto(default=False, *args)

# 别名:iconphoto

设置窗口图标,传入的是PhotoImage类的对象

default——同wm_iconbitmap()

99.wm_withdraw()

# 别名:withdraw

隐藏窗口,窗口不会被映射且不在窗口管理器上显示,可用wm_deiconify()还原

100.wm_state(newstate=None)

# 别名:state

设置或获取窗口的状态:

'normal':正常

'iconic':图标化(最小化)

'withdrawn':被隐藏

'icon':wm_iconwindow()方法中被用作图标

'zoomed':最大化

101.wm_maxsize(width=None, height=None)

# 别名:maxsize

设置窗口允许被调整的最大宽度和高度。无参数调用返回当前值

102.wm_minsize(width=None, height=None)

# 别名:minsize

设置窗口允许被调整的最小宽度和高度。无参数调用返回当前值

103.wm_resizable(width=None, height=None)

# 别名:resizable

指示是否可以改变窗口的宽度和高度。值都是布尔值,无参数调用返回当前值

104.wm_overrideredirect(boolean=None)

# 别名:overrideredirect

指示窗口管理器是否忽略该窗口,值为布尔值。无参数调用返回当前值

# 效果见winfo_containing()的示例

105.wm_title(string=None)

# 别名:title

设置窗口的标题。无参数调用返回当前值

106.wm_transient(master=None)

# 别名:transient

指示窗口管理器调用窗口对于窗口master是临时的。无参数调用返回当前值

# 在Windows上的临时窗口只有关闭按钮

示例:

运行结果:

# 窗口大小进行过手动拉伸

 


wm_protocol(ame=None, func=None)

# 别名:protocol

启动协议处理机制,name是协议名,func是回调函数

# 如果只传入协议名,则返回协议名对应的回调函数名:[一串数字][函数名]

# 无参数调用返回窗口所有协议的列表

最常用的协议是WM_DELETE_WINDOW:当用户点击窗口的关闭按钮时调用回调函数

# 其他协议见客户间通信协定手册(ICCCM)


七、标签控件(Label)

(1)、概念

标签控件主要用来显示窗口中的文本或者图像

(2)、演示图

# 此部分不给出代码,用于对控件有大体认识

(3)、构造方法

tkinter.Label(master=None, cnf={}, **kw)

master——指定父控件

cnf——将属性名称映射到值的字典

kw——使用关键字设置属性

# 后文将不再对master、cnf和构造方法里的kw做解释

补充:Label控件的背景构成  # 摘编自C语言中文网

Label控件背景由三部分构成内容区、填充区和边框,三个区域分别可用以下控件属性控制:

width/height

padx/pady

borderwidth

如下图所示:

# 图片来源:C语言中文网

(4)、属性项

activebackground, activeforeground, anchor, background, bd, bg, bitmap, borderwidth, compound, cursor, disabledforeground, fg, font, foreground, height, highlightbackground, highlightcolor, highlightthickness, image, justify, padx, pady, relief, state, takefocus, text, textvariable, underline, width, wraplength

1.anchor

文本(或图像)在Label中(内容区)显示的位置,值必须是'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'或'center'。默认值为'center'

2.text

指定显示在控件上的一行或多行文本,是一个字符串,使用'\n'换行

3.bitmap

指定显示在控件上的位图

# 位图见“补充:标准位图”

4.image

指定显示在控件上的图像,是一个图像对象(PhotoImage、BitmapImage类的对象)

# 实测如果同时指定text, bitmap, image,它们的优先级(从高到低)是image, bitmap, text

补充:图像

下面是两种在Tkinter中显示图像的方式:

1.使用位图BitmapImage类,需要是.xbm格式,这种方式不过多介绍

2.使用全彩图像PhotoImage类,需要是.gif, .pgm, .ppm, .png格式

构造方法是:tkinter.PhotoImage(file=文件路径)

# 注意,如果图像实例没有(动态)赋值给现有变量,图像将不会显示。另外注意函数中局部变量离开函数的生命周期后会被垃圾回收机制回收,所以建议动态赋值图像实例或将其保存为常量

# 图像类的方法和具体内容见后文章节“图像”

5.compound

当文本和图像同时显示时,指定图像位于文本的方位。值可以是'top', 'bottom', 'left', 'right', 'center', 'none'(或它们的缩写)。默认值为'none'

# 实测只有值为'center'时文本才包含在图像里

示例:

运行结果:

6.state

改变控件的状态,在不同控件中效果不同,值可以是'normal'(默认值), 'active', 'disabled'(或它们的缩写)

下为Lable控件的实测:

'active':文本的背景色和前景色变为activebackground, activeforeground

'disabled':文本变为浅灰色,图像呈棋盘状

7.foregroundfg

设置前景色:如果显示的是文本,则指定文本的颜色;如果显示的是位图,则指定位图中比特位为1的颜色。默认值由系统指定

8.activebackground, activeforeground

设置当控件状态为'active'时显示的背景色和前景色

9.disabledforeground

设置当控件状态为'disabled'时显示的前景色

10.font

指定文本的字体

补充:字体

下面是两种在Tkinter中设置字体的方式:

一、使用字符串或元组:(字体, 大小, 样式, 样式, ...)

# 使用字符串相当于''.join(元组)

大小——如果是正数,则以点数为单位;如果是负数,则以像素为单位

样式——是一个字符串,可包含一个或多个样式(用空格分隔),样式分别是:

字体粗细(二选一):'normal'(普通,默认值), 'bold'(加粗)

字体斜度(二选一):'roman'(罗马,默认值), 'italic'(倾斜)

其他样式:'underline'(下划线), 'overstrike'(删除线)

二、使用tkinter.font模块

使用其中的Font类创建字体对象:

Font(root=None, font=None, name=None, exists=False, **options)

root——主窗口

font——指定字体,使用方法同1

name——字体对象的名称,默认值是'fontN',N是第几个字体对象,名称唯一

exists——name指定的字体对象名称是否已经存在。如果为False,则在name指定的字体对象名称不存在时创建一个新的字体对象,否则抛出TclError;如果为True,则在name指定的字体对象名称存在时指向现有的字体对象,否则抛出TclError

options——属性项,如果font被指定了则会被忽略,下面是属性项:

family:字体

size:大小,单位是点数

weight:字体粗细,'normal', 'bold'

slant:字体斜度,'roman', 'italic'

underline:下划线,布尔值

overstrike:删除线,布尔值

# 实测默认值为:{'family': '宋体', 'size': 12, 'weight': 'normal', 'slant': 'roman', 'underline': 0, 'overstrike': 0},不同环境上的默认值应该不同

# 文本控件不设置font属性的默认值为'TkDefaultFont',具体见后

下面是Font类的方法:

1.actual(option=None, displayof=None)

返回字体对象的实际属性项值

option——属性项名,未给出则返回所有属性与实际值组成的字典。否则返回给定属性项的值

displayof——指定显示器

2.cget(option)

返回字体对象option属性项的值

# 这里的值是传入值而不是实际值

3.config(**options)

# 别名configure

修改字体对象的属性项值

4.copy()

返回字体对象的独立副本

# 这是将字体对象的实际属性项值传入构造方法得到的

5.measure(text, displayof=None)

返回将字体应用到text后的宽度,单位是像素

displayof——指定显示器

6.metrics(*options, **kw)

返回字体对象的font metrics(字体规格/字体度量)

# 关于font metrics,请查阅网络

下面是tkinter.font模块的常量:

NORMAL, ROMAN, BOLD, ITALIC

下面是tkinter.font模块的函数:

1.families(root=None, displayof=None)

以元组形式返回所有支持的字体

2.nametofont(name)

返回名为name的Font实例

# 在Python 3.10版添加了root形参:nametofont(name, root=None)

3.names(root=None)

以元组形式返回所有定义的字体

示例:

运行结果:

{'family': '微软雅黑', 'size': 15, 'weight': 'bold', 'slant': 'roman', 'underline': 1, 'overstrike': 0}

122

{'ascent': 21, 'descent': 6, 'linespace': 27, 'fixed': 0}

 

补充:标准字体

TkDefaultFont:所有GUI项目的默认字体

TkTextFont:用于Enter、Listbox等控件

TkFixedFont:一种标准的固定宽度的字体

TkMenuFont:用于菜单项的字体

TkHeadingFont:用于列表和表格标题的字体

TkCaptionFont:用于窗口和对话框标题栏的字体

TkSmallCaptionFont:用于子窗口或工具对话框的字体

TkIconFont:用于图标标题(icon captions)的字体

TkTooltipFont:用于工具提示(移动到控件之上显示控件功能)的字体

# 标准字体具体属性项值可使用nametofont()获取对应Font实例

11.justify

指定多行文本的对齐方式。值为'left', 'center'(默认值), 'right'(或它们的缩写)

12.padx, pady

指定控件左右两边提供的额外空间(控件边框与内容的间距),分别是水平和垂直,默认值都为1,单位是像素

此属性与布局方法中padx, pady属性的区别是控件属性padx, pady指定的是内边距。此属性与布局方法中ipadx, ipady属性的区别是,有些控件(例如框架控件Frame)如果其中没有内容或显示的是位图或图像时,控件属性padx, pady会省略而布局方法ipadx, ipady不会省略

13.textvariable

值为一个StringVar类的控制变量,设置后控件显示的文本是这个控制变量的值

# 关于控制变量参见下一章

14.underline

给指定的字符添加下划线,默认值-1表示不添加,值为整数,从0开始

# 实测如果文本(文本大小足够大)已有下划线,再用这个加下划线会使指定字符的下划线加粗

15.wraplength

指定每行的字符数,单位是像素。默认值为0,意味着只有在'\n'时才换行

# 默认值不为0时在'\n'时也会换行


示例:

运行结果:

示例2:

# 控件属性padx, pady和布局属性padx, pady, ipadx, ipady的区别

使用的图片:

green.png:

程序:

运行结果:

# 最左边标签控件因为是图片,省略额外空间padx, pady

# 中间控件和最右边控件分别用布局属性设置外边距和内边距

(5)、属性项的默认值及注意事项

background, bg:默认值由系统指定

borderwidth, bd:默认值为2

cursor:默认值为空字符串  # 空字符串代表系统默认或没指定

width, height:字符为单位,默认值都为0(根据文本大小自动选择适合的大小)

# 注意如果Label是图像则以像素为单位

relief:默认值为'flat'


八、控制变量/动态类型(Control variables)

# 此章参考:

https://tkdocs.com/shipman/control-variables.html

http://c.biancheng.net/tkinter/entry-widget.html

(1)、概念

GUI编程中,有时需要“动态跟踪”一些变量值的变换,从而保证值的变换及时地反映到显示界面上,但Python内置的数据类型无法做到这一目的,就需要使用Tcl内置的对象——控制变量(动态类型/Tcl变量)

 

控制变量的一个特殊性质就是可以被不同的控件共享且记住所有共享它的控件

(2)、创建

# 下面三个都是继承自Variable类

字符串控制变量:

StringVar(master=None, value=None, name=None)

整数控制变量:

IntVar(master=None, value=None, name=None)

浮点数控制变量:

DoubleVar(master=None, value=None, name=None)

布尔值控制变量:

BooleanVar(master=None, value=None, name=None)

master——指定父控件

value——指定值,默认值分别为'', 0, 0.0, False

name——指定名称,默认值为PY_VARnum(num是第几个控制变量)。如果name和现有的控制变量重名,则会覆盖原有的控制变量

(3)、方法

# 以下“变量”指“控制变量”

# 'trace_v...()'的方法和trace()方法是被废弃的

1.get()

返回变量的当前值

2.set(value)

# 别名:initialize

改变变量的当前值value。共享此变量的控件会在主循环下次空闲时被更新

补充:使用主窗口的getvar()和setvar()方法也可以获取或改变变量的值

3.trace_add(mode, callback)

为变量绑定一个回调函数,检测到mode操作时调用回调函数

mode——值为'read'(读取), 'write'(写入), 'unset'(删除),或者是包含它们的列表、元组和字符串

callback——回调函数。被回调时会被传递三个参数:(变量名/数组名称, 数组索引, 操作)

# 实际上mode的值还有'array',这里不详细说明

返回值是回调函数的名称:[一串数字][函数名]

4.trace_remove(mode, cbname)

删除变量的一个回调函数

mode——必须与trace_add()中指定的值相同

abname——trace_add()中返回的回调函数的名称


5.trace_info()

返回当前设置在变量上的所有回调函数的信息:

[((模式, 模式, ...), 回调函数名称), ((模式, 模式, ...), 回调函数名称), ...]

示例:


运行结果:

[(('read', 'write'), '1913088callback')]

width被读取

height被读取

width被写入

...

输入前:

输入后:


九、框架控件(Frame)

(1)、概念

框架控件是一个矩形窗体,是其他控件的一个容器,有助于组织用户界面

每个框架控件都有自己的布局(pack, grid或place),之间互不干扰

# 实际上根窗口基本上就是一个框架

(2)、演示图

(3)、构造方法

tkinter.Frame(master=None, cnf={}, **kw)

(4)、属性项

bd, borderwidth, class, relief, background, bg, colormap, container, cursor, height, highlightbackground, highlightcolor, highlightthickness, padx, pady, takefocus, visual, width

# container属性项见顶级窗口控件

补充:使用布局管理器的in(in_)属性使其他控件放置在框架容器中

(5)、属性项的默认值及注意事项

borderwidth, bd:默认值都为0

relief:默认值为'flat'

background, bg:默认值由系统指定

cursor:默认值为空字符串

width, height:默认值都为0

highlightthickness:默认值为0

highlightcolor, highlightbackground:默认值由系统指定

# 注意因为takefocus的默认值为0,控件不能获得焦点。所以只有当takefocus为1时,highlightcolor和highlightbackground才起作用

padx, pady:默认值都为0

takefocus:默认值为0


示例:

运行结果:

# pack默认居中,grid默认左上(0, 0)


十、标签框架控件(LabelFrame)

(1)、概念

属于框架控件的变体,与框架控件不同的是会在包裹的子控件周围绘制一个边框和一个标签

当想要将一些相关的控件分为一组时可以使用此控件

(2)、演示图

(3)、构造方法

tkinter.LabelFrame(master=None, cnf={}, **kw)

(4)、属性项

bd, borderwidth, class, fg, font, foreground, labelanchor, labelwidget, relief, text, background, bg, colormap, container, cursor, height, highlightbackground, highlightcolor, highlightthickness, padx, pady, takefocus, visual, width

1.labelanchor

指定控件边框上标签的位置,默认位置为'nw'(顶部的左端)

可选值有:'e', 'en', 'es', 'n', 'ne', 'nw', 's', 'se', 'sw', 'w', 'wn'或'ws'

具体位置请见下图:

图片来源:https://tkdocs.com/shipman/labelframe.html

# 注意'nw'与'wn'的位置不同,其他值同样

2.labelwidget

使用另一个控件代替标签

如果同时传入labelwidget和text属性,则text的值将被忽略

(5)、属性项的默认值及注意事项

borderwidth, bd:默认值为2

foreground, fg:默认值由系统指定

# 前景色和后面的字体等都是对边框周围的标签作用的

font:默认值为'TkDefaultFont'

relief:默认值为'groove'

text:默认值为空字符串

background, bg:默认值由系统指定

container:默认值为0

cursor:默认值为空字符串

width, height:默认值都为0

highlightthickness:默认值为0

highlightcolor, highlightbackground:默认值由系统指定

padx, pady:默认值都为0

takefocus:默认值为0

示例:

运行结果:





Python Tk GUI系列笔记(tkinter篇(初)) 第一章~第十章的评论 (共 条)

分享到微博请遵守国家法律