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

Python Tk GUI系列笔记(tkinter篇(下)) 第二十四章~第三十二章

2023-08-21 08:00 作者:水母山楂  | 我要投稿

〇、前言

此系列主要介绍tkinter库——Tk图形用户界面(GUI)及其相关内容,内容参考以下网站:

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.10,Tk版本8.6

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

有些运行结果会使用gif动图展示,或是有额外的补充文件,需到Python tkinter result文件中的查看

# gif录制软件:ScreenToGif

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

颜色代表含义:

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

绿色:示例

橙色:补充

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

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

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

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

二十四、标尺控件(Scale)

(1)、概念

标尺控件是一根类似标尺式的滚动条对象,用户通过操作它可以直接设置相应的数值(刻度值)

可以使用鼠标左键拖动滑块到一个新的数值,点击周围槽可以将滑块向上(左)或向下(右)移动一个单位。如果标尺控件有焦点,则按方向箭头可以向对应方向移动一个单位

Ctrl加上或左箭头则向上或左移动大幅度,反之亦然

Home键将滑块移动到上端或左端,End键将滑块移动到下端或右端

(2)、演示图


(3)、构造方法

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

(4)、属性项

activebackground, background, bigincrement, bd, bg, borderwidth, command, cursor, digits, fg, font, foreground, from, highlightbackground, highlightcolor, highlightthickness, label, length, orient, relief, repeatdelay, repeatinterval, resolution, showvalue, sliderlength, sliderrelief, state, takefocus, tickinterval, to, troughcolor, variable, width

1.from, to

# 因为from是Python的关键字,所以from有别名:from_

使用from和to属性限制数值在闭区间[from, to]。from默认值为0.0,to默认值为100.0

# from和to可以是浮点数,to的值必须大于from的值

2.orient

当值为'horizontal'时标尺是水平标尺,当值为'vertical'(默认值)时标尺是垂直标尺。值可以是它们的缩写

3.digits

是一个整数,表示将刻度值转换为字符串时保留的有效数字个数

# 这里的“有效数字个数”是指当刻度值为to属性指定值是的数字个数

# 实测如果值<=0或>17和值为0一样

示例:

from_=1, to=100, digits=5:


from_=1, to=9, digits=5:



3.1.resolution

指定标尺的分辨率(一格的单位)

刻度值显示值总是属性项_from加上该值的任意非负整数倍

默认值为1

4.variable

指定一个控制变量,设置后控件的刻度值是这个控制变量的值

5.bigincrement

指定标尺大幅度移动的量

如果为0(默认值),则为标尺范围的1/10

6.label

在标尺控件显示标签并设置其文本

水平标尺会在左上角显示标签,垂直标尺会在右上角显示标签

7.showvalue

是一个布尔值,表示是否显示当前刻度值

8.length

标尺控件的长度,默认值100像素

对于水平的是它的宽度,对于垂直的是它的高度

9.sliderlength

指定滑块的尺寸,单位是像素

10.sliderrelief

指定滑块的边框样式

11.tickinterval

是一个数字,指定刻度线的间隔数值

默认值为0,表示不显示刻度线

12.troughcolor

滚动槽的颜色

13.command

是一个函数,在标尺刻度值改变时传入刻度值调用

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

activebackground, background, bg, fg, foreground, highlightbackground, highlightcolor:默认值由系统指定

cursor, takefocus:默认值为空字符串

bd:默认值为1

borderwidth:默认值为1

font:默认值为'TkDefaultFont'

highlightthickness:默认值为2

relief:默认值为'flat'

# repeatdelay和repeatinterva对应的是滚动槽按钮

repeatdelay:默认值为300

repeatinterval:默认值为100

state:默认值为'normal'

width:默认值为15,注意这是滚动条的宽度(对于水平的是它的高度)

(6)、方法

1.coords(value=None)

以元组形式(x, y)返回滑块中心相对于标尺控件左上角的坐标

value——滑块在对应刻度值时的中心坐标。如果为空,则是当前的刻度值

2.get()

返回滑块的当前刻度值,类型是int

3.set(value)

设置滑块的当前刻度值为value

4.identify(x, y)

返回位于滚动条控件像素坐标x, y的组成名称,无则返回空字符串。组成名称包括'trough1', 'trough2', 'slider'


二十五、顶级窗口控件(Toplevel)

(1)、概念

顶级窗口控件是类似于Frame控件,但是在窗口管理器下独立存在的窗口(窗口脱离根窗口独立存在),属于主窗口的子控件

对于任意控件w,使用w.winfo_toplevel()方法获取控件的顶级窗口控件

# 实测顶级窗口会在创建后的主循环中自动放置

(2)、演示图

(3)、构造方法

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

(4)、属性项

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

1.screen

指定放置顶级窗口控件的屏幕

# 这个属性项不能使用configure或属性项数据库来改变

2.container

是一个布尔值,如果值为True,则这个控件可用作容器,其他应用程序可使用use属性项嵌入到其中,但其不能有任何自己的子控件

# 这个属性项不能使用configure来改变

3.use

用于嵌入窗口,值是一个容器窗口的id(也就是窗口句柄)。如果容器窗口是Tk程序中的,则它应是container值被指定为True的框架或顶层窗口控件

# 这个属性项不能使用configure来改变

示例:


运行结果:

运行时:

 

等待三秒后:

 

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

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

cursor:默认值为空字符串

bd:默认值为0

borderwidth:默认值为0

relief:默认值为'flat'

container:默认值为0

height:默认值为0

highlightthickness:默认值为0

padx:默认值为0

pady:默认值为0

takefocus:默认值为0

width:默认值为0

# menu属性在Menu控件中说明

(6)、方法

见章节“主窗口(Tk)与控件和窗口部分方法”中“部分方法”从wm_aspect()以后的方法


二十六、窗格控件(PanedWindow)

(1)、概念

窗格控件类似于特殊的Frame控件,但它允许用户通过拖动窗格分割线(或窗格手柄)来调整窗格的大小

# 下文称sash(窗扇)为“分割线”

(2)、演示图


(3)、构造方法

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

(4)、属性项

background, bd, bg, borderwidth, cursor, handlepad, handlesize, height, opaqueresize, orient, proxybackground, proxyborderwidth, proxyrelief, relief, sashcursor, sashpad, sashrelief, sashwidth, showhandle, width

1.orient

当值为'horizontal'(默认值)时水平方向布局控件,当值为'vertical'时垂直方向布局控件。值可以是它们的缩写

2.sashcursor

当鼠标移动到分割线上时的鼠标样式

如果为空(默认值),则sb_h_double_arrow应用于水平窗格,sb_v_double_arrow应用于垂直窗格

3.sashwidth

分割线的宽度,默认值为3

4.sashrelief

分割线的边框样式,默认值为'flat'

5.sashpad

分割线的外边距(分割线周围的空白区域),默认值为0

6.showhandle

是否显示窗格手柄,默认不显示

7.handlesize

窗格手柄的边长(手柄是正方形的),默认值为8

8.handlepad

窗格手柄距离窗格控件顶端或左端(取决于orient)的距离,默认值为8


9.opaqueresize

如果为True,则在窗格移动时调整其大小;如果为False,则在窗格移动松开鼠标时调整其大小,这会显示分割线的“幽灵”版本作为其代理,用于显示松开鼠标时调整的位置

10.proxybackground

绘制代理的背景色。如果是空字符串则使用background属性的值

11.proxyborderwidth

代理的边框宽度,默认值为2

12.proxyrelief

代理的边框样式,默认值为'flat'

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

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

cursor, height, width:默认值为空字符串

bd:默认值为1

borderwidth:默认值为1

relief:默认值为'flat'

(6)、方法

# 下面称使用add()方法添加到窗格控件内的控件是窗格控件的“子控件”

1.add(child, **kw)

向窗格控件中添加一个子控件child,kw指定属性项(见paneconfigure())

2.remove(child)

# 别名:forget

从窗格控件中删除一个子控件child

3.paneconfigure(child, cnf=None, **kw)

# 别名:paneconfig

# 在方法定义处的child参数名称是tagOrId,但应该是命名错误

设置子控件child的属性项,有以下的属性项:

after, before:值必须是一个窗格控件的子控件,子控件child会在传入值的子控件之前/之后进行添加

width, height:子控件的宽度和高度

# 实测水平窗格控件的高度或垂直窗格控件的宽度取决于其子控件的最大高度或宽度

padx, pady:子控件的水平外边距和垂直外边距

minsize:指定子控件的最小尺寸。对于水平窗格是宽度,对于垂直窗格是高度

# 指定后无论怎么拖动分割线,子控件尺寸不会小于该值。不建议同时指定width(水平窗格)

或height(垂直窗格)

hide:设置子控件是否可见

sticky:通过E, W, S, N组合的字符串来定位子控件在窗格的位置,空字符串为居中。默认值为'nesw'(填满窗格)

stretch:指定为窗格分配额外空间的方式。额外空间出现在设置width(水平窗格)或height(垂直窗格)的窗格控件中,例如当添加的控件宽度或高度没达到窗格控件的宽度或高度,当使用remove()删除窗格时。当额外空间出现时,会被均分到可伸展的窗格。传入以下的值:

    'always':该窗格始终可伸展

    'first':该窗格只当是第一个窗格时才可伸展

    'last'(默认值):该窗格只当是最后一关窗格时才可伸展

    'middle':该窗格只当不是第一个或最后一关窗格时才可伸展

    'never':该窗格始终不可伸展


4.panecget(child, option)

以字符串形式返回child对应属性项option的值

5.identify(x, y)

返回位于窗格控件像素坐标x, y的索引和组成名称组成的二元组,无则返回空字符串。索引代表第几个分割线或手柄(从0开始),组成名称包括'sash', 'handle'

6.panes()

返回子控件的有序元组

示例1:

运行结果:

窗格控件1中的所有子控件 (<string object: '.!listbox'>, <string object: '.!panedwindow2'>)

窗格控件2中的所有子控件 (<string object: '.!text'>, <string object: '.!message'>)

运行时:


拖动分割线(或窗格手柄):

示例2:  # 演示stretch


运行结果:

运行时:


 

依次点击三个按钮:


# 当窗格为可扩展时,会均分额外空间

7.sash(*args)

查询或改变分割线的位置。第一个参数指定模式(见下面的方法名),后面参数是对应方法的参数

# 模式还有'dragto',参数是index, x, y,与其他控件的scan_dargto()方法类似

8.sash_coord(index)

返回分割线左上角的位置(x, y),index指定第几个分割线(从0开始)

9.sash_mark(index)

与其他控件的scan_mark()方法类似。配合sash('drato')移动分割线

10.sash_place(index, x, y)

改变索引index对应的分割线位置到x, y

11.proxy(*args)

查询或改变代理的位置。第一个参数指定模式(见下面的方法名),后面参数是对应方法的参数

12.proxy_coord()

返回代理左上角的位置(x, y)

13.proxy_forget()

删除代理

14.proxy_place(x, y)

改变代理的位置到x, y


二十七、菜单控件(Menu)

(1)、概念

菜单控件以可视化的方式将一系列菜单项(menu entry)进行分组,并在每个分组下又“隐藏”了许多其他的菜单项。当打开菜单时,这些菜单项就会“显式”的呈现出来,方便用户进行选择

菜单控件可分为三种类型:menubar/topleve(菜单栏/主目录菜单/窗口菜单)、pull-down(下拉式菜单)、pop-up/contextual(弹出式菜单/上下文菜单/快捷式菜单)

# 也可以分为两种:菜单栏、弹出式菜单

Windows上的菜单控件支持分离式菜单(tear-off menu),分离式菜单的最上方会有一条虚线,用户点击虚线会出现一个新的、独立的、包含菜单项的工具栏窗口

# 注意,以下外观类及尺寸类选项对菜单栏类型的菜单控件无效

(2)、演示图

 


(3)、构造方法

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

(4)、属性项

activebackground, activeborderwidth, activeforeground, background, bd, bg, borderwidth, cursor, disabledforeground, fg, font, foreground, postcommand, relief, selectcolor, takefocus, tearoff, tearoffcommand, title, type

1.activeborderwidth

实测是菜单项的边框宽度

# 对弹出式菜单和下拉式菜单都有效

2.postcommand

是一个函数,在菜单被弹出时执行

# 由于平台限制,Windows一个菜单系统中的所有该属性项的回调函数会在菜单系统的任意一个菜单弹出时一起触发

# 菜单栏类型的菜单在菜单栏被按下时触发该属性项的回调函数(即使没按到菜单项)

3.tearoff

是否启用分离式菜单

4.tearoffcommand

是一个接收两个位置参数的函数,在菜单被分离时调用,调用传参菜单的控件名和分离窗口的控件名

5.title

设置分离窗口的显示名

6.type

# 此属性项由Tk库内部使用,这里不过多介绍

值可以是'menubar', 'tearoff'或'normal'

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

activebackground, activeforeground, background, bg, disabledforeground, fg, foreground:默认值由系统指定

# active和disabled的针对的是菜单项的state属性项

selectcolor:默认值由系统指定。这是指定单选框或多选框菜单项的颜色

borderwidth, bd:默认值为0。实测对分离式菜单有效

cursor:默认值为'arrow'。只对分离式菜单有效

font:默认值为'TkMenuFont'

relief:默认值为'flat'。实测只对分离式菜单有效

takefocus:默认值为0

(6)、索引

索引对应一个菜单项

1.active

索引对应活动的菜单项

2.end, last

索引对应最后一个菜单项

3.none

索引不对应任何菜单项。常与activate()方法一起使用

4.@y

y是数字,被视为菜单的Y坐标,索引对应菜单Y坐标的菜单项

5.数字

正向索引(从0开始)

6.字符串

索引对应字符串匹配菜单项文本的菜单项

# 如果索引对应多个菜单项,则以靠前的优先

(7)、添加菜单

1.菜单栏

将新创建的菜单控件传入主控件的menu属性项

2.下拉式菜单

将新创建的菜单控件传入其他菜单控件分层菜单项的menu属性项

3.弹出式菜单

将新创建的菜单控件绑定事件<Button-3>,触发事件时在触发事件处使用post()方法弹出菜单

# 代码语句参考:root.bind('<Button-3>', lambda event: menu.post(event.x_root, event.y_root))

(8)、添加或插入菜单项和分割线

通过以下控件方法,可以添加菜单项或菜单分割线

菜单项有:命令菜单项、分层菜单项、多选框菜单项、单选框菜单项

1.add(itemType, cnf={}, **kw)

在菜单最后添加一个菜单项。第一个参数指定模式(见下面的方法名),后面参数是对应方法的参数。在最后传入键值对设置菜单项的属性项

2.add_command(cnf={}, **kw)

添加命令菜单项。命令菜单项会在按下菜单项时执行对应函数

3.add_cascade(cnf={}, **kw)

添加分层菜单项。分层菜单项会在按下菜单项时显示另一个菜单控件


4.add_checkbutton(cnf={}, **kw)

添加多选框菜单项

5.add_radiobutton(cnf={}, **kw)

添加单选框菜单项

6.add_separator(cnf={}, **kw)

添加菜单分割线

7.insert(index, itemType, cnf={}, **kw)

在菜单index索引处添加一个菜单项。第一个参数指定模式(见下面的方法名),后面参数是对应方法的参数。在最后传入键值对设置菜单项的属性项

8.insert_command(index, cnf={}, **kw)

9.insert_cascade(index, cnf={}, **kw)

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

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

12.insert_separator(index, cnf={}, **kw)

参考add_*()中的对应方法

示例:  # 演示图的代码


当修改pm的tearoff为True时的分离式菜单:





 

(9)、菜单项和分割线的属性项

因为大多数属性项对分割线和分离式菜单都不适用,所有以下属性项对分割线和分离式菜单适用的在后面提出。仅对某个或某些菜单项适用的属性项在前面提出

1.state

指定菜单项的状态:'normal', 'active'或'disabled'

# 当鼠标移动到菜单项('normal'状态)上时,菜单项的状态是'active'

2.background

菜单项的背景色

3.activebackground

菜单项活动状态时的背景色

4.foreground

菜单项的前景色

5.activeforeground

菜单项活动状态时的前景色

6.font

菜单项的字体

7.label

菜单项显示的标签

8.accelerator

菜单项右侧显示快捷键的标签

# 这个属性只是显示作用,并不设置对应快捷键。设置快捷键使用bind()实现

9.bitmap

菜单项显示的位图,会覆盖label属性

10.image

菜单项显示的图像,会覆盖label和bitmap属性

11.compound

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

12.command

当菜单项被按下时调用的函数

在Windows上对指定子菜单的分层菜单项无效


13.underline

指定菜单项标签中要下划线的字符的数字索引

在按下Alt后会将菜单中被指定下划线的字符添加下划线,按下被添加下划线的字符可以执行对应菜单项

示例:

在IDLE Shell 3.10.11中按下Alt键、F键、X键,退出程序:


14.columnbreak

当值为0时(默认值),该项显示在前一项的下面;当值为1时,该项显示在菜单中新一列的顶部。对分割线和分离式菜单适用

# 该选项在Aqua/MacOS上被忽略

示例:在复制选项卡中指定该属性项为1

15.hidemargin

是否将菜单选项左右空白边距去除。对分割线和分离式菜单适用

# 必须一列菜单选项都设置该属性为True才会去除

# 官方举的例子是颜色调色板、图案调色板等

示例:

左图是设置为False,右图是设置为True:

 


16.menu

仅适用于分层菜单项。指定该菜单项的子菜单

17.indicatoron

仅适用于多选框和单选框菜单项。是否显示菜单项指示器

18.selectcolor

仅适用于多选框和单选框菜单项。菜单项指示器的颜色

19.selectimage

仅适用于多选框和单选框菜单项。菜单项被选中的图像,只在设置image属性之后才能生效

20.offvalue

21.onvalue

22.value

23.variable

offvalue, onvalue仅适用于多选框菜单选,value仅适用于单选框菜单项,variable仅适用于多选框和单选框菜单项

见多选框控件章节和单选框控件章节相应控件属性

(10)、其他方法

1.index(index)

返回index对应的数字索引

2.delete(index1, index2=None)

删除闭区间[index1, index2]之间的所有菜单项。如果省略index2,则删除index1的菜单项

该方法不会删除分离式菜单的最上面的虚线菜单项,删除它应改变tearoff属性项

3.activate(index)

将index对应菜单项的状态变为active。如果index为'none'或指定的菜单项被禁用,则菜单控件中将没有菜单项状态为active

4.invoke(index)

如果菜单项状态不是disabled且command已指定,则调用command并返回结果

5.post(x, y)

在桌面坐标(x, y)位置弹出菜单

6.unpost()

取消弹出坐标。该方法在Windows和Macintosh无效,因为这些平台有自己取消弹出的方法

7.entryconfigure(index, cnf=None, **kw)

# 别名:entryconfig

设置index对应菜单项的属性项

8.entrycget(index, option)

以字符串形式返回index对应菜单项的属性项option的值

9.type(index)

返回index对应菜单项的类型:'tearoff', 'command', 'cascade', 'separator', 'checkbutton', 'radiobutton'

10.xposition(index)

返回index对应菜单项距离菜单控件左上角的像素坐标x

# 这是弹出式菜单的坐标

11.yposition(index)

返回index对应菜单项距离菜单控件左上角的像素坐标y

# 这是弹出式菜单的坐标

12.tk_popup(x, y, entry='')

弹出菜单,entry指定的菜单项左上角的点被定位在桌面坐标(x, y),空字符串代表菜单控件左上角被定位在桌面坐标(x, y)


(11)、系统菜单

在Windows上,每个窗口左上角都会有一个系统菜单,它可以用快捷键Alt+空格呼出

 


如果有一个菜单控件是菜单栏菜单控件的子控件,且名为'system',则在菜单栏菜单控件添加分层菜单项指定menu为名为'system'的菜单控件,它的菜单项会附加到这个系统菜单上

# 字体、颜色、图像、位图等不会显示在系统菜单中

示例:


运行结果:



二十八、菜单按钮控件(MenuButton)

(1)、概念

菜单按钮控件是一个与菜单控件相关联的按钮

关联具体过程是:新建一个菜单按钮控件,再新建一个菜单控件,它被指定为菜单按钮控件的子控件,再将菜单按钮控件的menu属性改为这个菜单控件

菜单按钮控件默认边框样式是'flat',在被按下时会变成'raised'

(2)、演示图

 


(3)、构造方法

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

(4)、属性项

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

1.indicatoron

如果为True,则在菜单按钮控件右边显示一个小型矩形指示器;如果是False(默认值),则不显示

2.direction

指定菜单弹出的位置,值可以是'above'(上), 'below'(下), 'left'(左), 'right'(右)

# 当菜单在上和下弹出位置显示在屏幕外,菜单弹出位置会上下颠倒

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

activebackground, activeforeground, background, bg, disabledforeground, fg, foreground, highlightbackground, highlightcolor:默认值由系统指定

bitmap, cursor, image, menu, text, textvariable:默认值为空字符串

anchor:默认值为'center'

bd:默认值为1

borderwidth:默认值为1

font:默认值为'TkDefaultFont'

height:默认值为0

highlightthickness:默认值为0

justify:默认值为'center'

padx:默认值为'4p'

pady:默认值为'3p'

relief:默认值为'flat'

compound:默认值为'none'

state:默认值为'normal'

takefocus:默认值为0

underline:默认值为-1。注意underline的作用是标签控件中的而不是菜单控件

width:默认值为0

wraplength:默认值为0

示例:


运行结果:


 


二十九、选项菜单控件(OptionMenu)

(1)、概念

选项菜单控件继承自MenuButton类,用户在一个下拉菜单中选择一项选项

(2)、演示图


 

(3)、构造方法

tkinter.OptionMenu(master, variable, value, *values, **kwargs)

master——指定父控件,必须指定

variable——绑定的控制变量

value, values——指定选项

kwargs——关键字只支持command,回调函数会传参选定选项的值

(4)、属性项固定值

borderwidth:固定值为2

textvariable:固定值为variable,构造方法传入的控制变量

indicatoron:固定值为1

relief:固定值为RAISED

anchor:固定值为"c",也就是'center'

highlightthickness:固定值为2

示例:


运行结果:

运行时:


分别选中A、选中B:


A 被选中

B 被选中


三十、图像

(1)、图像类

图像类Image被位图类BitmapImage和图片类PhotoImage所继承,位图类和图片类都有图像类的方法

1.方法

1.1.configure(**kw)

# 别名:config

设置图像的属性项,这里只能修改不能查询

1.2.width()

返回图像的宽度

1.3.height()

返回图像的高度

1.4.type()

返回图像的类型:'photo'或'bitmap'

补充:call()方法

主窗口控件和实例变量tk(_tkinter.Tkapp对象,Tkinter中类基本都含有)有一个call()方法,这个方法能够在Tcl解释器中执行Tcl/Tk命令

后文会补充一些用Tcl/Tk命令执行,但在Python模块中没有相应函数/方法的

加粗字体代表字符串形式

1.5.Tcl/Tk命令:image inuse name

如果名为name的图像被任何控件使用,则返回1,否则返回0

补充:tkinter模块下的image_names()函数和image_types()函数

分别是返回存在的图像名称和有效的图像类型

在image属性项可以直接传入图像名称来使用它

# 以下对Tk位图的解释含有个人理解,不保证完全权威、正确

(2)、位图类

Tk中的位图是单色位图,Tk中位图图像由背景色、前景色和两个位图(源和掩码)定义

1.构造方法

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

2.支持格式

XBM

补充:XBM  # 摘抄自百度百科

X-Bitmap(XBM)是一种古老但通用的图像文件格式,它与许多Web浏览器都兼容。X-Windows图形界面(UNIX和Linux常用的GUI)的C代码库xlib中有一个组件专门描述了它的规范。XBM图形的实质上是使用16进制数组来表示二进制图像的C源代码文件

3.属性项

3.1.background

指定图像的背景色,一个像素掩码位图为1、源位图为0时会显示该背景色。如果值为空字符串(默认值),则背景色为透明

3.2.foreground

指定图像的前景色,一个像素掩码位图为1、源位图为1时会显示该前景色。默认值'#000000'(黑色)

3.3.file

指定源位图文件。文件必须遵守X11位图格式

3.4.data

指定源位图字符串,会覆盖file属性。字符串必须遵守X11位图格式


3.5.maskfile

指定掩码位图文件。文件必须遵守X11位图格式

3.6.maskdata

指定掩码位图字符串,会覆盖file属性。字符串必须遵守X11位图格式

当一个像素掩码位图为0时会显示透明

示例:


运行结果:

图像是否被使用: 0

图像是否被使用: 1

37

26

bitmap

存在的图像名称: ('::tk::icons::information', '::tk::icons::error', '::tk::icons::warning', 'mybitmap', '::tk::icons::question')

有效的图像类型: ('photo', 'bitmap')

 


(3)、图片类

1.构造方法

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

2.支持格式

GIF, PGM, PPM, PNG

3.属性项

3.1.data

将图像的数据内容以字符串传入。字符串可以是二进制数据或base64编码数据(支持PNG和GIF)。如果同时指定data和file,则优先使用file

3.2.file

指定图像的文件名

3.3.format

指定数据或文件的图像格式对应的处理程序。如果忽略则自动选择

某些图像格式支持子属性项,使用方法是在值后面空格加上“-属性项 值”,子属性项如下:

3.3.1.gif -index

指定图片是gif图片中第index个图片,index从0开始

# 实测gif图片其他帧图片在程序中展示的不理想:

 


3.3.2.png -alpha

指定图像的alpha值,值在0~1之间(透明~不透明)

示例:

alpha值分别指定1, 0.5, 0.25, 0:

 


设置控件背景色为绿色,图像alpha值分别指定1, 0.5, 0.25, 0:

 


3.4.width

指定图像的宽度,单位是像素。默认值0代表值为图像数据或文件宽度

3.5.height

指定图像的高度,单位是像素。默认值0代表值为图像数据或文件高度

3.6.gamma

指定图像的伽马值(亮度)。值必须大于0才有效。默认值为1(正常亮度)。一般大于1图像会变亮、小于1图片会变暗

示例:

分别指定伽马值0.1, 0.001, 2, 20:

 


3.7.palette

指定RGB彩色立方体的分辨率

如果值是一个十进制整数,则代表单色(灰度),范围2~256

如果值是用斜线(/)分隔的三根十进制整数,则代表使用红色、绿色、蓝色的色调数(color shades),范围2~256

示例:

 


分别指定palette为2, 10, 2/2/2, 256/256/2

 


 

4.方法

4.1.blank()

将图像设置为完全透明

4.2.configure(**kw)

# 别名:config

设置图像的属性项

4.3.cget(option)

以字符串形式返回图像的属性项option的值

4.4.get(x, y)

返回图像中坐标为(x, y)的像素的颜色,返回一个三元组:(R, G, B)

# 实测palette属性不影响结果

4.5.width()

返回图像的宽度

4.6.height()

返回图像的高度


4.7.copy()

复制图像,返回新的图片对象

4.8.zoom(x, y='')

复制图像,并在原图像x方向缩放至原来的x倍,y方向缩放至原来的y倍(y没指定则同x)。返回新的图片对象

参数x, y必须是正整数

4.9.subsample(x, y='')

复制图像,并在原图像x方向缩放至原来的x分之一,y方向缩放至原来的y分之一(y没指定则同x)。如果x/y为负数,则图像垂直/水平翻转并缩放。返回新的图片对象

参数x, y必须是整数

4.10.put(data, to=None)

设置图像中从to位置开始的像素点颜色或to范围内像素点的颜色指定为数据data中的颜色

data——颜色数据:

如果是单个颜色字符串,则将to位置颜色替换为该颜色

如果格式是(color, color, ...),则从to位置开始,从上到下替换颜色

如果格式是[(color, color, ..), (color, color, ...), ...],则从to位置开始,从上到下读取列表中的每个元组,按元组中的元素从左到右替换颜色。元组中的元素必须个数相等

to——替换起始位置或范围,默认是(0, 0):

如果是(x),则起始位置是(x, x)

如果是(x, y),则起始位置是(x, y)

如果是(x1, y1, x2),则范围是(x1, y1, x2, x2)

如果是(x1, y1, x2, y2),则范围是(x1, y1, x2, y2)

当to代表的是起始位置替换时,会从to位置开始在原图像替换颜色,多出的颜色会继续替换(不足的地方透明)

当to代表的是范围替换时,会从to范围矩形的左上角开始替换颜色,不足的颜色会按已填充的颜色平铺填充,多出的颜色忽略

示例:

程序同一目录下的图片blue.png(64x64):

 


程序:


运行结果(图片缩放两倍):

4.11.write(filename, format=None, from_coords=None)

将图像数据写入名为filename的文件

format——指定图像格式对应的处理程序。如果忽略则自动选择

from_coords——指定范围:

如果忽略,则范围是整个图像

如果为(x, y),则范围是(x, y)到图像右下角的矩形区域

如果为(x1, y1, x2, y2),则范围是(x1, y1)到(x2, y2)的矩形区域

4.12.transparency_get(x, y)

返回位于(x, y)的像素点是否为透明

4.13.transparency_set(x, y, boolean)

如果boolean为真,则将位于(x, y)的像素点设为透明,否则设为不透明

4.14.Tcl/Tk命令:图片对象 data [option value(s)]

返回图像数据。返回形式取决于-format属性项

默认返回形式是返回一个元组,元组内每个元素代表一行颜色,颜色之间用空格分隔,颜色是'#XXXXXX'形式的

option value(s)——属性项,可选值如下:

-background color:用于取代透明像素点的颜色,未指定则是该像素点原来颜色

-format format-name:指定图像格式对应的处理程序。如果忽略则自动选择

-from x1 y1 x2 y2:指定范围,见write()

-grayscale:如果指定该项,则将数据转为灰度

示例:

程序同一目录下的图片blue.png(64x64):

程序:


运行结果(无缩放):

 


(4)、注意事项

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


三十一、对话框

(1)、消息对话框

1.概念

消息对话框(messagebox)主要起到信息提示、警告、说明、询问等作用,它包含程序指定的图标、信息和一组按钮

消息对话框弹出后,会等待用户选择其中的一个按钮,然后返回所选按钮的名称

2.导入模块

导入tkinter包下的messagebox模块使用消息对话框:

import tkinter.messagebox [as 别名]

from tkinter import messagebox

from tkinter.messagebox import *

3.函数

下列参数适用于messagebox模块中的所有函数(非下划线开头):

title——是一个字符串,作为消息对话框的标题,默认为空字符串

message——是一个字符串,指定在消息对话框中显示的消息,默认为空字符串

options——属性项

3.1.showinfo(title=None, message=None, **options)

返回值'ok'(包括右上角关闭按钮)

 

# 演示图的标题和显示信息是自己添加的

3.2.showwarning(title=None, message=None, **options)

返回值'ok'(包括右上角关闭按钮)

 

3.3.showerror(title=None, message=None, **options)

返回值'ok'(包括右上角关闭按钮)

 


3.4.askquestion(title=None, message=None, **options)

返回值'yes'或'no'

3.5.askokcancel(title=None, message=None, **options)

返回值True或False,右上角关闭按钮返回False

3.6.askretrycancel(title=None, message=None, **options)

返回值True或False,右上角关闭按钮返回False

3.7.askyesno(title=None, message=None, **options)

返回值True或False

3.8.askyesnocancel(title=None, message=None, **options)

返回值True, False或None,右上角关闭按钮返回None

4.

Message(master=None, **options)

创建一个默认信息对话框对象

master——指定父控件。没有指定则是options中的parent属性

options——属性项

4.1.show(**options)

使用对象的show()方法弹出对话框,用户选定按钮后返回选定值

options——属性项

5.属性项

messagebox模块中函数或类的属性项:

5.1.title

指定消息对话框的标题

5.2.message

指定在消息对话框中显示的消息

5.3.icon

指定显示的图标,值是'error'(错误), 'info'(信息,默认值), 'question'(问题/询问)或'warning'(警告)

5.4.type

指定显示的一组预定义按钮,可选值如下:

'abortretryignore':中止/重试/忽略按钮(abort/retry/ignore)

'ok':确定按钮(ok)

'okcancel':确定/取消按钮(ok/cancel)

'retrycancel':重试/取消按钮(retry/cancel)

'yesno':是/否按钮(yes/no)

'yesnocancel':是/否/取消按钮(yes/no/cancel)

# messagebox模块内函数都指定了icon和type,并且有的函数对返回值有相应的处理

5.5.parent

指定父控件。父控件所在窗口在没有关闭对话框的情况下会处于阻塞禁用状态

5.6.detail

指定显示在message信息下的辅助信息

5.7.default

指定默认按钮。默认按钮在弹出对话框时有蓝色边框并且按下回车可以激活

默认按钮必须是type中出现的名称

6.常量

messagebox模块中定义了如下的常量,值是常量名对应的字符串

图标:

ERROR, INFO, QUESTION, WARNING

预定义按钮:

ABORTRETRYIGNORE, OK, OKCANCEL, RETRYCANCEL, YESNO, YESNOCANCEL

返回值:

ABORT, RETRY, IGNORE, OK, CANCEL, YES, NO

# 因为messagebox模块中定义了__all__,所以常量和类不能用from ... import *方法导入

示例:


运行结果:

运行后在文本框输入一些文字:

 


点击按钮后弹出信息对话框,两次都按“是”:

 


# 第二次按“是”后,会使用默认打开程序打开text.txt文件

(2)、文件选择对话框

1.概念

文件选择对话框(filedailog)用于在本地选择文件或者保存文件

2.导入模块

导入tkinter包下的filedialog模块使用文件选择对话框:

import tkinter.filedialog [as 别名]

from tkinter import filedialog

from tkinter.filedialog import *

补充:模态对话框与非模态对话框

# 摘抄自百度百科

当用户打开模态对话框(Modal Dialogue Box,又叫做模式对话框)时,用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应

而当用户打开非模态对话框(Nonmodal Dialogue Box,又叫做无模式对话框)时,依然可以操作其他窗口


3.函数

以下函数的**options参数都是属性项,且都会创建一个模态的、原生外观的对话框,等待用户选取,再将选中值或None返回

3.1.askopenfile(mode='r', **options)

3.2.askopenfiles(mode='r', **options)

3.3.askopenfilename(**options)

3.4.askopenfilenames(**options)

四个函数都创建Open对话框(打开对话框)

区别:

askopenfile()只能打开一个文件,返回模式为mode的文件对象,取消时返回None

askopenfiles()能打开多个文件,返回模式为mode的文件对象组成的列表,取消时返回''

askopenfilename()只能打开一个文件,返回文件名的绝对路径,取消时返回''

askopenfilenames()能打开多个文件,返回文件名的绝对路径组成的元组取消时返回''

3.5.asksaveasfile(mode='w', **options)

3.6.asksaveasfilename(**options)

两个函数都创建SaveAs对话框(另存为对话框)

区别:

asksaveasfile()选择另存为的文件,返回模式为mode的文件对象,取消时返回None

asksaveasfilename()选择另存为的文件,返回文件名的绝对路径,取消时返回''

# asksaveasfile()会创建文件而asksaveasfilename()不会

# SaveAs对话框和Open对话框的区别是SaveAs对话框可选择不存在的文件

3.7.askdirectory(**options)

创建选择目录(文件夹)对话框,返回目录的绝对路径,取消时返回''

4.属性项

4.1.parent

指定父控件。父控件所在窗口在没有关闭对话框的情况下会处于阻塞禁用状态

4.2.title

指定文件对话框的标题

4.3.initialdir

打开对话框时位于的目录

4.4.mustexist

用户是否只能选择现已存在的目录

# 实测无效,可能是操作系统的原因

# 以下属性项对于目录对话框不适用

4.5.initialfile

打开对话框时选中的文件

4.6.filetypes

指定筛选文件类型的下拉菜单选项。对于目录对话框不适用

值的格式是:

[(文件类型描述, 匹配模式), (文件类型描述, 匹配模式), ...]

# 列表与元组可以替换为序列

文件类型描述:是一个字符串,用来描述文件类型

匹配模式:

是一个字符串,会在字符串前自动加通配符'*'。在字符中没有'.'时匹配后缀;在字符串又'.'时,'.'前匹配文件名,'.'后匹配后缀。匹配可以使用通配符'*'。值为'*'即匹配所有文件,值为''即匹配无后缀的文件

或是一个序列,其中每个元素是上述的字符串,可以匹配多项


4.7.typevariable

打开对话框时默认的筛选文件类型的下拉菜单选项

值是一个控制变量,控制变量的值是filetypes中的文件类型描述,作为默认选项

在对话框确认时修改这个控制变量的值为确认时文件类型描述的字符串

4.8.efaultextension

在另存为对话框用户没有指定文件后缀时附加到文件的后缀

值是字符串,代表文件后缀(可以不加前面的'.')

4.9.multiple

仅适用于打开对话框。如果为True则允许多选

4.10.confirmoverwrite

仅适用于另存为对话框。如果为True(默认值),则在覆盖文件时弹出确认对话框,否则不会弹出

5.

5.1.Open(master=None, **options)

5.2.SaveAs(master=None, **options)

5.3.Directory(master=None, **options)

创建一个打开/另存为/目录对话框对象,这个对象的对话框是系统原生外观的

master——指定父控件

options——属性项

5.3.1.show(**options)

使用对象的show()方法弹出对话框,用户确定文件后返回文件或目录的绝对路径,取消时返回''

options——属性项

示例:


运行时:

 


点击选择图片,并选择图片:

 


另存为图片:

 

 

# 要想把后缀的PNG变为小写,将代码中f'.{cit_val}'改为f'.{cit_val.lower()}'

# 下面的类只是粗略介绍,具体见:

https://docs.python.org/zh-cn/3.10/library/dialog.htm

5.4.FileDialog(master, title=None)

创建一个简单的文件选择对话框对象

# 这个文件对话框不是系统原生外观而是Tk的外观,外观如下:

5.5.LoadFileDialog(master, title=None)

5.6.SaveFileDialog(master, title=None)

都是FileDialog的子类,分别创建用于选取已有文件的对话框对象和创建用于选择目标文件的对话框对象

(3)、颜色选择对话框

1.概念

颜色选择对话框(colorchooser)用于用户选择颜色

2.导入模块

导入tkinter包下的colorchooser模块使用颜色选择对话框:

import tkinter.colorchooser [as 别名]

from tkinter import colorchooser

from tkinter.colorchooser import *


3.函数

3.1.askcolor(color=None, **options)

创建一个颜色选择对话框。调用后弹出对话框,等待用户选择颜色,再将选择的颜色返回

color——同属性项initialcolor。如果同时指定则覆盖initialcolor

options——属性项如下:

initialcolor:默认显示的颜色。默认值是'#a0a0a0'(浅灰色)

title:颜色选择对话框的标题,默认为'颜色'

parent:指定父控件。父控件所在窗口在没有关闭对话框的情况下会处于阻塞禁用状态

返回值是一个二元组(选取颜色的RGB元组, 选取颜色的十六进制形式)。如果取消选择,则返回值是(None, None)

4.

Chooser(master=None, **options)

创建一个颜色选择对话框对象

master——指定父控件。没有指定则是options中的parent属性

options——属性项

4.1.show(**options)

使用对象的show()方法弹出对话框,用户选定按钮后返回上述的二元组

options——属性项

示例:


运行结果:

运行时:

 


点击“选择颜色”按钮,选择颜色为蓝色:

# 点击后默认显示颜色是绿色

 

(4)、字体选择对话框

1.概念

字体选择对话框(fontchooser)用于用户选择字体

2.Tcl/Tk命令

tkinter包中还没有字体选择对话框的相关模块,只能使用call()方法调用Tcl解释器

2.1.tk fontchooser show

显示字体选择对话框,在Windows上是模态的、原生外观的对话框,在对话框撤回后返回(返回空字符串,要获取字体信息见command属性项)

2.2.tk fontchooser hide

隐藏字体选择对话框(如果可见)

2.3.tk fontchooser configure [-option [value]] [-option [value]], ...

设置字体选择对话框的属性项

-option value——属性项,可选值如下:

-parent:指定/返回父控件

-title:指定/返回对话框的标题

-font:指定对话框中默认显示的字体  # 实测在Windows 7中-font不能获取值

-command:值是一个使用register()方法进行注册的回调函数。在字体选择对话框中的“应用”和“确定”按钮被按下时调用,传入一个位置参数,代表用户选择的字体

# font值的格式和command回调值的格式参见其他控件中字体设置使用字符串设置的方式

-visible:只读属性项,返回布尔值,代表字体选择对话框当前是否可见

示例:


运行结果:

运行时:

 


输入'ABCD一二三四'后点击按钮,选择黑体、粗体、14号、下划线:

 


# “应用”按钮只有设置command属性才会出现

点击“应用”按钮或“确定”按钮:

 


补充:tkinter.simpledialog模块

tkinter.simpledialog模块包含一些便捷类和函数,用于创建简单的模态对话框(Tk外观),从用户那读取一个值

函数如下:

askfloat(title, prompt, **kw)

askinteger(title, prompt, **kw)

askstring(title, prompt, **kw)

三个函数都是提供给用户输入浮点数/整数/字符串类型的对话框,用户输入后点“OK”按钮返回用户输入的值

title参数指定对话框的标题、prompt指定在对话框中显示的信息

kw指定其他项,这些项用关键字传参:

initialvalue(初始值)、minvalue(最小值)、maxvalue(最大值)、parent(父控件)

askstring()函数还有额外的项show,它指定文本框内容以何种样式的字符显示

# 字符串大小比较同Python比较字符串

类如下:

1.Dialog(parent, title)

自定义对话框的基类,parent指定父控件,title指定对话框的标题

在创建实例后,会创建对话框并显示(显示时会阻塞调用处),对话框销毁后通过实例的result属性获取结果

实例方法如下:

1.1.destroy(self)

销毁对话框

1.2.body(self, master)

创建对话框主体,被构造方法调用。该方法应被重写,重写应在方法内创建控件并通过布局管理器包装到master(master是一个框架控件)中,返回值代表有初始焦点的控件

1.3.buttonbox(self)

添加底部按钮,被构造方法调用。如果不想要它提供的按钮则重写,重写将self作为主控件,并向其中添加控件。确定和取消按钮事件可绑定下面的方法

1.4.ok(self, event=None)

1.5.cancel(self, event=None)

点击确定和取消按钮事件处理方法。重写它们可自定义处理

1.6.validate(self)

在默认ok()方法调用时的验证数据的方法,返回布尔值代表验证是否通过(默认总是通过)。重写它可自定义验证数据

1.7.apply(self)

在默认ok()方法调用完验证方法后的处理数据的方法,没有返回值。它处于ok()方法try...finally...结构中,重写它可自定义处理数据

 

2.SimpleDialog(master, text='', buttons=[], default=None, cancel=None, title=None, class_=None)

一个简单但灵活的模态对话框。创建实例后应使用go()方法显示模态对话框

master——指定父控件

text——在对话框中显示的信息,

buttons——指定显示在底部的按钮,点击后go()方法返回点击按钮的正向索引

default——用户在对话框中点击Enter键后go()方法返回的值

cancel——用户在点击右上角关闭按钮后go()方法返回的值

# 如果cancel参数未给出,则右上角关闭按钮无效

title——对话框的标题

class_——传入对话框创建控件Toplevel中的class_值

实例方法如下:

2.1.go(self)

将对话框设为模态,并阻塞。当对话框消耗后返回实例的num属性值

2.2.return_event(self, event)

默认回车键事件的处理方法,可以重写它来自定义

2.3.wm_delete_window(self)

默认右上角关闭按钮事件的处理方法,可以重写它来自定义

2.4.done(self, num)

代表用户操作对话框完毕,默认处理是将实例属性值num设为参数num的值,再退出对话框。可以重写它来自定义


三十二、Tcl/Tk命令:tk busy

参考:

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

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

(1)、概念

tk busy命令提供简单方法来阻止来自控件的鼠标事件。使用该命令可以让控件变为忙碌状态,处于忙碌状态的控件及其子控件将忽略来自用户的鼠标事件(例如点击),并且当鼠标指针在上面时会使用可配置的特殊光标替换原来指针

# 注意这个命令不能阻止来自控件的键盘事件(例如Tab键)

(2)、命令

1.tk busy hold window [option value, ...]

使控件window及其子控件变为忙碌状态

option value——属性项,可选值只有-cursor,指定控件忙碌状态显示的光标,在Windows上的默认值是wait,其他平台是watch

2.tk busy window [option value, ...]

tk busy hold命令的快捷命令

3.tk busy configure window [option value, ...]

设置忙碌状态控件window的属性项

4.tk busy cget window option

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

5.tk busy forget window [window] ...

取消(多个)控件window的忙碌状态

6.tk busy current [pattern]

返回当前所有处于忙碌状态的控件路径名

pattern——如果指定,则只返回匹配pattern的路径名

# 个人实测pattern似乎是正则表达式

7.tk busy status window

如果控件window处于忙碌状态,则返回1,否则返回0

补充:防止忙碌状态控件获得键盘焦点从而操作

可以将焦点移动到另一个控件,并确保焦点不能返回到忙碌状态的控件

或者将忙碌控件的takefocus属性设置为False

示例:


运行结果:

运行时:

 


按下按钮1时:

 

按下按钮2时:

















Python Tk GUI系列笔记(tkinter篇(下)) 第二十四章~第三十二章的评论 (共 条)

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