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

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

2023-07-25 13:24 作者:水母山楂  | 我要投稿

〇、前言

此系列主要介绍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.8,Tk版本8.6
# 在“属性项数据库”及以后章节使用Python版本3.10,对运行结果基本无影响

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

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

# gif录制软件:ScreenToGif

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

颜色代表含义:

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

绿色:示例

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

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

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

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


十一、输入控件(Entry)

(1)、概念

输入控件的作用是允许用户输入单行文本(多行见文本框控件(Text))

(2)、演示图

(3)、构造方法

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

(4)、属性项

background, bd, bg, borderwidth, cursor, disabledbackground, disabledforeground, exportselection, fg, font, foreground, highlightbackground, highlightcolor, highlightthickness, insertbackground, insertborderwidth, insertofftime, insertontime, insertwidth, invalidcommand, invcmd, justify, readonlybackground, relief, selectbackground, selectborderwidth, selectforeground, show, state, takefocus, textvariable, validate, validatecommand, vcmd, width, xscrollcommand

1.disabledbackground

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

2.insertbackground

指定插入光标(键盘输入插入到文本的点)的颜色,默认值由系统指定(一般黑色)

3.insertborderwidth

指定插入光标边框宽度,且边框样式是'raised',确保insertwidth属性的值至少是该值的两倍

默认值为0

4.insertwidth

指定插入光标的宽度,默认值为2

5.insertofftime

指定插入光标闪烁后停歇(处于“灭”状态)花费的时间,为零则光标一直处于“亮”状态

默认值为300

6.insertontime

指定插入光标每次闪烁(处于“亮”状态)花费的时间,为零则不显示插入光标

默认值为600

# 如果以上两个属性同时为0,实测光标一直处“亮”状态;如果为负则会引起卡顿

7.selectbackground

指定选中文字时的背景色,默认值由系统指定

8.selectforeground

指定选中文字时的前景色,默认值由系统指定

9.selectborderwidth

指定选中文字时的边框宽度,默认值为0

10.show

指定文本框内容以何种样式的字符显示,默认值为空字符串(不指定)

# 例如密码可设置为'*'


示例:

运行结果:

11.readonlybackground

指定当控件state属性设置为'readonly'时的背景色

12.exportselection

是否将输入框选中的文本复制到剪贴板,默认值为1

# 实测对输入控件的效果不同,在选中文本后单击鼠标中间会在选中文本前面粘贴一份(不会复制到剪贴板)

13.xscrollcommand

见章节“滚动条控件(Scrollbar)”

14.validate

15.validatecommand, vcmd

16.invalidcommand, invcmd

见此章“(7)、验证功能”

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

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

borderwidth, bd:默认值为1

cursor:默认值为'xterm'(输入光标)

highlightthickness:默认值为0

justify:默认值为'left'

relief:默认值为'sunken'

state:默认值为'normal'。注意在输入控件多了'readonly'(只读)状态,去掉了'active'状态

takefocus:默认值为空字符串

textvariable:默认值为空字符串。注意可以使用控制变量的.get()方法获得输入控件的值

width:默认值为20。注意单位是字符数

# 注意没有height,因为Entry是允许输入单行文本


(6)、方法

1.关于索引

输入控件的索引可以是以下几种形式,“@数字”及后面的是字符串,区分大小写

适用于输入控件需要索引的方法

1.1.数字

正向索引(从0开始),可以是整数或字符串

1.2.@数字

数字被视为文本框的X坐标(像素为单位,数字不能是'3c'等形式),索引对应文本框X坐标的字符

# X坐标也就是水平视图

1.3.end

索引对应文本框最后一个字符

1.4.insert

索引对应插入光标的下一个字符

1.5.sel.first

索引对应选中文字的第一个字符。如果没有选中文字则抛出TclError异常

1.6.sel.last

索引对应选中文字的最后一个字符。如果没有选中文字则抛出TclError异常

# 以上字符串可以用它们的缩写形式,例如'e'或'sel.l'

2.delete(first, last=None)

删除文本框内正向索引区间[first, last)的文本

3.get()

获取文本框内的文本

4.icursor(index)

在index处插入光标

5.index(index)

返回index对应的数字索引

6.insert(index, string)

在index处插入string

示例:

运行结果:

7.scan_mark(x)

8.scan_dragto(x)

见章节“拖拽与缩放功能”

9.selection_from(index)

# 别名:select_from

设置选定区的ANCHOR位置为index

# 选定区是选定文本的区域

# ANCHOR位置指用鼠标点击文本框文本的位置、shift加箭头选中文本后的位置、shift加箭头选中文本后取消选中文本的开始选中文本的位置等等

# 只用箭头键移动插入光标不会改变原来的ANCHOR位置

# 插入光标位置对应的ANCHOR位置具体是插入光标后边的字符的正向索引

10.selection_to(index)

# 别名:select_to

选中从ANCHOR位置到index的字符位置(不包括)之间的所有文本

11.selection_adjust(index)

# 别名:select_adjust

确保选定区包含指定index的字符。如果选定区已包括则无效果,否则选定就会从ANCHOR位置扩展到包括index的字符位置

# 实测如果已存在选定区,则会从选定区的位置扩展,并将ANCHOR改为选定区距离index远的那一端的索引

12.selection_present()

# 别名:select_present

如果选定区存在字符则返回True,否则返回False

13.selection_range(start, end)

# 别名:select_range

选中索引区间[start, end)之间的文本

14.selection_clear()

# 别名:select_clear

清除控件内的选定区

示例:

运行结果:

开始时:

输入文本后,点击8与9之间的间隔并分别点击从左到右、从上到下的第2个、第3个按钮:

# 当前ANCHOR位置为8

依次点击第4个、第3个按钮:

# 当前ANCHOR位置为8

# 当前ANCHOR位置为2

依次点击第5个、第6个、第5个按钮:

True

False

补充:xview和yview分别是水平视图和垂直视图

# 注意,移动视图并不会改变插入光标的位置

15.xview(*args)

无参数调用,返回当前的水平视图位置:

(左边到达水平视图的百分数, 右边到达水平视图的百分数)

一个参数调用,则是一个索引,将视图的水平位置移动到索引处

多个参数调用,则第一个参数是属性项,其他的参数是传入值,属性项有moveto和scroll(或它们的缩写,见下面的两个方法)

16.xview_moveto(fraction)

将左边到达水平视图移动到相应百分数fraction

17.xview_scroll(number, what)

根据以what为单位的number移动水平视图

number——是一个整数,可以为负

what——可选值如下(可使用它们的缩写):

'units'(单元):一个字符为一个单元

'page'(页数):一次占满视图的为一页

示例:


运行结果:

开始时:

将以下文本输入到文本框:

1222222222222222222222222222222222222222222222222222223333333333333333333333333333333333333333333333333333

点击第1个按钮:

(0.49056603773584906, 1.0)

依次点击第3个、第1个、第2个按钮:

# 此时左边只有一个字符'1'

依次点击第4个、第5个按钮:


补充:

实际上,xview(), xview_moveto(), xview_scroll()方法来自父类XView,相对应的还有yview(), yview_moveto(), yview_scroll()方法来自YView

后文会在支持XView或YView的控件方法最后换行加上“支持XView/YView”


(7)、验证功能

1.概念

输入控件可以对输入内容进行验证,比如只能输入英文字母、只能输入数字等等

通过以下属性项进行设置

# 实测当指定textvariable时,如果回调函数不返回True,则验证功能会失效

2.validate

指定何时进行验证,值是一个字符串,可选择以下的值(或它们的缩写):

focus:当控件获得或失去焦点的时候验证

focusin:当控件获得焦点的时候验证

focusout:当控件失去焦点的时候验证

key:当输入框被编辑的时候验证

all:当出现以上任何一种情况的时候验证

none:默认不启用验证功能,注意是字符串'none'

3.validatecommand(别名:vcmd)

指定用户自定义的回调函数(验证函数)。如果文本有效则使回调函数返回True,否则返回False。当validate='key'或'all'时,如果回调函数返回False,文本内容将保持不变(这里的保持不变是指验证时的文本)

可以提供一些额外的替换代码,这些替换代码作为位置参数传入回调函数:

(回调函数, 替换代码1, 替换代码2)

# 替换代码与格式化字符串相似,但有些替换代码后面不能接控件代码、字母、数字等

回调函数必须通过控件的register()方法进行注册才能使用替换代码

补充:register(func, subst=None)

# 定义在Misc类的方法,所有控件都可调用

返回一个新创建的Tcl函数,当这个函数被调用时会调用Python函数

subst——在func之前调用的函数,返回值作为位置参数传递给func

# 可以使用装饰器语法进行注册(在函数前加@register)

替换代码:

%d:动作代码。0表示试图删除;1表示试图插入;-1表示回调是由获得或失去焦点、textvariable发生变化而被调用

%i:当用户试图删除或插入文本时的起始索引位置;-1表示回调是由获得或失去焦点、textvariable发生变化而被调用

%P:返回用户试图删除或插入文本后文本框的文本

%s:返回用户试图删除或插入文本前文本框的文本

%S:返回用户试图删除或插入的文本

# 实测%P、%s、%S当替换代码字符串不止有它们自己时空字符串表示为'{}',它们在除试图删除或插入文本的回调中是空字符串

%v:表示当前控件的validate参数的值

%V:表示回调的原因,值为'focusin', 'focusout', 'key'或''force''(回调由textvariable发生变化而被调用)

%W:表示控件的名字

# %%表示字符'%'

4.invalidcommand(别名:invcmd)

当validatecommand指定的回调函数返回False时,设置方法与validatecommand相同

示例:

运行结果:

十二、单选框按钮控件(Radiobutton)

(1)、概念

单选框按钮控件仅允许用户在几个互斥的选项值之间选择单一的一个

单选框按钮控件通常都是成组出现的,所有控件都使用相同的变量。其中可以包含文本或图像,每一个按钮都可以与一个Python函数相关联

要将几个单选框按钮控件组成一组,可以创建一个控制变量,并将每个单选框按钮控件的variable属性设置为该变量,将value属性设置为与控制变量相同类型的唯一值

(2)、演示图

(3)、构造方法

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

(4)、属性项

activebackground, activeforeground, anchor, background, bd, bg, bitmap, borderwidth, command, compound, cursor, disabledforeground, fg, font, foreground, height, highlightbackground, highlightcolor, highlightthickness, image, indicatoron, justify, offrelief, overrelief, padx, pady, relief, selectcolor, selectimage, state, takefocus, text, textvariable, tristateimage, tristatevalue, underline, value, variable, width, wraplength

1.indicatoron

指示是否显示单选框按钮的指示器(前面的小圆圈)。如果值为0(默认值为1),则指示器会消失,并且控件变成一个“按压式”按钮,选中按钮时按钮样式为'sunken',取消选中按钮时按钮样式为'raised'

2.offrelief

指定当indicatoron属性值为0时取消选中按钮时的按钮样式,默认值为'raised'

3.selectcolor

当按钮被选中时的颜色。默认值由系统指定

# 实测如果indicatoron不为0,则按钮指示器的颜色会一直是该属性指定的颜色;如果为0,则该属性指定的颜色作为按钮被选中后的背景色

4.selectimage

当按钮被选中时的图像,只在设置image属性之后才能生效

5.variable

与组内其他按钮共享的控制变量

6.value

当按钮被选中时,它的variable属性的控制变量被设置为此属性的值

7.tristatevalue

下面为此属性的实测:

使按钮处于“三态”或“混合”状态的值,当控制变量的值等于该属性值但不等于value的值时按钮会处于这种状态。如果按钮有指示器,则处于这种状态的指示器会选中变灰

另外,当控制变量的值为空字符串时,也会处于这种状态

8.tristateimage

下面为此属性的实测:

当按钮处于“三态”或“混合”状态时的图片,只在设置image属性之后才能生效

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

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

bitmap, command, cursor, image, overrelief, takefocus, text, textvariable:默认值为空字符串

anchor:默认值为'center'

borderwidth, bd:默认值为2

compound:默认值为'none'

font:默认值为'TkDefaultFont'

width, height:默认值都为0

highlightthickness:默认值为1

justify:默认值为'center'

padx, pady:默认值都为1

relief:默认值为'flat'

state:默认值为'normal'

underline:默认值为-1

wraplength:默认值为0

(6)、方法

1.flash()

使按钮在活动状态和正常状态的颜色之间闪烁几次,如果按钮状态是disabled则被忽略

2.invoke()

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

# 注意这会使单选框按钮处于选中状态

3.select()

使按钮处于选中状态

4.deselect()

取消按钮的选中状态

# 实测取消单选按钮的选中状态会使对应控制变量的值变为空字符串

示例:

from tkinter import *

root = Tk()

 

iv = IntVar(value=0)

r1 = Radiobutton(text='A.选项1', variable=iv, value=1)

r2 = Radiobutton(text='B.选项2,控制变量值为1时进入“三态”', variable=iv,

                 value=2, tristatevalue=1)

red_p = PhotoImage(file='red.png')

blue_p = PhotoImage(file='blue.png')

r3 = Radiobutton(image=red_p, variable=iv,

                 value=3, tristateimage=blue_p)

r4 = Radiobutton(text='D.选项4,选中时背景变绿色', selectcolor='green',

                 indicatoron=0, variable=iv, value=4)

r5 = Radiobutton(text='E.选项5,选中后取消选中自身', variable=iv, value=5,

                 command=lambda: r5.deselect())

r1.pack(anchor='w')

r2.pack(anchor='w')

r3.pack(anchor='w')

r4.pack(anchor='w')

r5.pack(anchor='w')

Label(textvariable=iv).pack()

 

root.mainloop()

运行结果:

十三、多选框按钮控件(Checkbutton)

(1)、概述

多选框(复选框)按钮控件允许用户同时选择多项,各个选项之间属于并列的关系

使用variable属性设置按钮相关联的控制变量,再通过onvalue/offvalue属性设置按钮被勾选/取消勾选时相关联的控制变量的值

# 多选框按钮与单选框按钮的不同在于它可以在勾选和取消勾选的状态间切换

(2)、演示图

(3)、构造方法

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

(4)、属性项

activebackground, activeforeground, anchor, background, bd, bg, bitmap, borderwidth, command, compound, cursor, disabledforeground, fg, font, foreground, height, highlightbackground, highlightcolor, highlightthickness, image, indicatoron, justify, offrelief, offvalue, onvalue, overrelief, padx, pady, relief, selectcolor, selectimage, state, takefocus, text, textvariable, tristateimage, tristatevalue, underline, variable, width, wraplength

1.onvalue

当多选框按钮被勾选时控制变量的值,默认值为1

# 当控制变量的值等于此属性的值时,多选框按钮会自动被勾选

2.offvalue

当多选框按钮取消勾选时控制变量的值,默认值为0

# 只有在切换勾选状态时才改变控制变量的值

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

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

bitmap, command, cursor, image, overrelief, selectimage, takefocus, text, textvariable, tristateimage, tristatevalue, variable:默认值为空字符串

anchor:默认值为'center'

bd:默认值为2

borderwidth:默认值为2

compound:默认值为'none'

font:默认值为'TkDefaultFont'

height:默认值为0

highlightthickness:默认值为1

indicatoron:默认值为1

justify:默认值为'center'

offrelief:默认值为'raised'

padx:默认值为1

pady:默认值为1

relief:默认值为'flat'

state:默认值为'normal'

underline:默认值为-1

width:默认值为0

wraplength:默认值为0

(6)、方法

1.flash()

使按钮在活动状态和正常状态的颜色之间闪烁几次,如果按钮状态是disabled则被忽略

2.invoke()

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

# 注意这会切换多选框按钮的勾选状态

3.select()

使按钮处于勾选状态

4.deselect()

取消按钮的勾选状态

5.toggle()

切换按钮的勾选状态

示例:

运行结果:

运行时:

勾选一些按钮点击下方按钮后:


十四、列表框控件(Listbox)

(1)、概念

列表框控件是一个显示单行文本项目(条目)的列表,允许用户浏览该列表并选择一个或多个项目

# 这里的“项目”也就是元素,后文称作“项目”或“项”

(2)、演示图

(3)、构造方法

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

(4)、属性项

activestyle, background, bd, bg, borderwidth, cursor, disabledforeground, exportselection, fg, font, foreground, height, highlightbackground, highlightcolor, highlightthickness, justify, relief, selectbackground, selectborderwidth, selectforeground, selectmode, setgrid, state, takefocus, width, xscrollcommand, yscrollcommand, listvariable

1.listvariable

应是一个StringVar,它存放列表中所有的项目

当调用它的.get()方法,将返回“('v0', 'v1', ...)”形式的字符串,其中每个vi(i是索引)是列表中每一个项目

# 注意是字符串而不是元组,可以用eval()内置函数变成元组

设置这个控制变量的值(使用.set()或在创建时指定值)可以改变列表中的项目,值是一个包含项目的字符串,项目之间用空格分隔,例如'a b c'是项目a, b, c

2.activestyle

指定active line的样式:

'underline':下划线(默认值)

'dotbox':虚线框

'none':无

# active line以下译作“活动行”,是当前选中的一行,可通过箭头改变,例如演示图中的选项H

3.selectmode

设置选择模式——可以选择多少项、拖动鼠标的情况:

'single':只能选择一项,不能拖动鼠标,方向键只改变活动行

'browse'(默认值):只能选择一项,选择跟随鼠标,方向键改变活动行和选择

'multiple':可以选择多项,不能拖动鼠标,方向键只改变活动行

'extended':可以选择多项,可以拖动鼠标或按住Shift选择多行,但每次选择都会使之前的选择清空,除非按住Ctrl。方向键改变活动行和选择,按住Shift不会使之前的选择清空

# 使用selectbackground, selectborderwidth, selectforeground属性分别设置选中时的背景色、边框宽度、前景色


4.xscrollcommand

5.yscrollcommand

见章节“滚动条控件(Scrollbar)”

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

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

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

bd:默认值为1

borderwidth:默认值为1

font:默认值为'TkDefaultFont'

height:默认值为10。注意高是项目数

highlightthickness:默认值为1

justify:默认值为'left'

relief:默认值为'sunken'

selectborderwidth:默认值为0

state:默认值为'normal'

width:默认值为20。注意宽是字符数

exportselection:默认值为1。实测如果为1,则按Ctrl+C可复制已选中项目,否则不能

示例:

运行结果:

运行时:


选择一些项目:

点击按钮后:

(6)、方法

1.关于索引

# 具体说明见输入控件

1.1.数字

正向索引(从0开始),可以是整数或字符串

1.2.activate

索引对应活动行

1.3.end

索引对应最后一项。对于index()和insert()方法它是最后一项之后的一项

1.4.@x,y

x, y是数字,分别被视为列表框的X, Y坐标(像素为单位,数字不能是'3c'等形式),索引对应列表框X, Y坐标的项

2.activate(index)

指定index为活动行

3.delete(first, last=None)

删除列表框内正向索引区间[first, last]的项

4.get(first, last=None)

获取列表框内正向索引区间[first, last]的项,返回“('v0', 'v1', ...)”形式的元组

# 注意这里返回的是元组而不是字符串

5.index(index)

返回index对应的数字索引

6.insert(index, *elements)

在index处插入项。位置形参elements的每一个元素是一个项

7.curselection()

返回选择项的索引。返回值是一个元组,按从小到大顺序排列

# “选择项”是已选中的项目

8.nearest(y)

返回距离Y坐标(像素为单位,数字不能是'3c'等形式)最近的项的索引

9.see(index)

滚动视图使index可见

10.itemconfigure(index, cnf=None, **kw)

# 别名:itemconfig

设置index的属性项,有以下的属性项:

background, bg:背景色

foreground, fg:前景色

selectbackground:选中时的背景色

selectforeground:选中时的前景色

# 这与控件方法config()的区别这是指定项而不是控件

11.itemcget(index, option)

返回index的属性项option的值

示例:

运行结果:

(0, 2)

12.scan_mark(x, y)

13.scan_dragto(x, y)

见章节“拖曳与缩放功能”

14.selection_anchor(index)

# 别名:select_anchor

将选区锚点设置为index,如果index不存在则使用距离index最近的。选区锚点是用鼠标拖拽选区时选区固定的末端

15.selection_clear(first, last=None)

# 别名:select_clear

取消选择区间[first, last]之间的项

16.selection_includes(index)

# 别名:select_includes

如果index被选中则返回True,否则返回False

17.selection_set(first, last=None)

# 别名:select_set

选中区间[first, last]之间的项。不会影响范围外的项的选择状态

18.size()

返回列表框内项的数量

 

支持XView和YView


十五、滚动条控件(Scrollbar)

(1)、概念

滚动条控件常用于创建一个水平或垂直的滚动条,主要用来控制控件区域的可见范围

# 似乎是受操作系统的影响,实测全部改变外观的属性项(例如bg, bd等)以及一些属性项无效

1.组成

1.1.滑块/滚动条拇指(slider/scroll thumb)

是一个凸起的矩形,表示当前的滚动位置

拖动滑块可以移动视图

1.2.箭头按钮(arrowheads)

位于滚动条的两端,用于微移滚动位置。位于滚动条左边或上边的箭头按钮称为arrow1,右边或下边的箭头按钮称为arrow2

点击arrow1可以将视图向左或上移动一小段,点击arrow2可以将视图向右或下移动一小段。不同控件移动的距离不同

1.3.滚动槽/滚动条轨道(trough/scroll track)

是箭头按钮和滑块的后面的凹陷部分。位于滚动条左边或上边的滚动槽称为trough1,右边或下边的滚动槽称为trough2

点击trough1可以将视图向左或上移动一页,点击trough2可以将视图向右或下移动一页

2.滚动位置

滚动位置是闭区间[0.0, 1.0]中的一个数字,是滑块的位置。0.0代表滑块在顶部或左端;1.0代表滑块在底部或右端

# 这个数字也就是是滑块位置的百分数

3.视图位置

(左边到达水平视图的百分数, 右边到达水平视图的百分数)或是(上边到达垂直视图的百分数, 下边到达垂直视图的百分数)

4.为控件增加滚动条

需要分别设置滚动条控件的command属性项和对应控件的xscrollcommand或yscrollcommand方法

4.1.command

是当滚动条控件更新时的回调函数,不同操作传入值不同,通常是对应控件的xview()或yview()方法。如果不指定,则用户操作滚动条时,对应控件不会改变视图位置

4.2.xscrollcommand/yscrollcommand

是当对应控件视图发生变化的回调函数,传入两个位置实参(视图位置),通常是滚动条控件的set()方法。如果不指定,则当对应控件视图发生变化时,滑块位置不会改变

(2)、演示图

(3)、构造方法

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

(4)、属性项

activebackground, activerelief, background, bd, bg, borderwidth, command, cursor, elementborderwidth, highlightbackground, highlightcolor, highlightthickness, jump, orient, relief, repeatdelay, repeatinterval, takefocus, troughcolor, width

1.command

更多信息见此章“(1)、4.1”,这里说明不同操作的传入值:

当用户点击arrow1:command(tk.SCROLL, -1, tk.UNITS)

当用户点击arrow2:command(tk.SCROLL, 1, tk.UNITS)

当用户点击trough1:command(tk.SCROLL, -1, tk.PAGES)

当用户点击trough2:command(tk.SCROLL, 1, tk.PAGES)

当用户拖动滑块:command(tk.MOVETO, f)  # f是滚动位置

2.orient

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

# 以下属性项实测在Windows7中实测无效

3.jump

当值为0(默认值)时滑块每一小段拖动都会调用command指定的回调函数;当值为1时直到用户释放鼠标时才会调用command指定的回调函数

4.activerelief

当鼠标放在滑块上时滑块的边框样式,默认值为'raised'

5.elementborderwidth

箭头按钮和滑块的边框宽度,默认值为-1(使用borderwidth的值)

6.troughcolor

滚动槽的颜色

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

# 实测无效的不会列出

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

width:默认值为17。注意如果是水平滚动条,则是滚动条的高度

(6)、方法

1.activate(index=None)

无参数调用返回'arrow1', 'arrow2', 'slider'或''中的其中一个,取决于当前的鼠标位置。传入index参数则突出显示index(使用其activerelief和activebackground)

# 实测无效

2.delta(deltax, deltay)

返回一个浮点数,代表滑块滚动位置的分数加或减多少才能使滑块向右/下移动deltax/deltay像素

滚动条控件是水平滚动条时deltay将被忽略,是垂直滚动条时deltax将被忽略

# deltax和deltay是整数

3.fraction(x, y)

返回闭区间[0.0, 1.0]之间的浮点数,代表位于滚动槽像素坐标x, y或距离x, y最近一个点的滚动位置

4.identify(x, y)

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

5.get()

返回当前滑块的位置(first, last),first, last都是滚动位置。first代表当前滑块顶部或左端的位置,last代表当前滑块底部或右端的位置

6.set(first, last)

设置当前滑块的位置

first, last——见get()

示例:


运行结果:

运行时:

从左到右,从上到下依次点击每个按钮后:

-0.09389671361502347

0.5570469798657718

trough2

(0.0, 0.1)

将水平滚动条拖到最右侧后点击第3个按钮:

trough1


十六、微调框控件(Spinbox)

(1)、概念

微调框控件是输入控件的升级版,它允许用户从一个给定的集合中选择数值(集合是数字集或字符串集)或直接输入数值,有一个显示当前值的区域和微调选择器(一对上下箭头)

(2)、演示图

(3)、构造方法

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

(4)、属性项

ctivebackground, background, bd, bg, borderwidth, buttonbackground, buttoncursor, buttondownrelief, buttonuprelief, command, cursor, disabledbackground, disabledforeground, exportselection, fg, font, foreground, format, from, highlightbackground, highlightcolor, highlightthickness, increment, insertbackground, insertborderwidth, insertofftime, insertontime, insertwidth, invalidcommand, invcmd, justify, relief, readonlybackground, repeatdelay, repeatinterval, selectbackground, selectborderwidth, selectforeground, state, takefocus, textvariable, to, validate, validatecommand, values, vcmd, width, wrap, xscrollcommand

1.from, to

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

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

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

2.increment

当使用from和to属性限制数值时用户每次点击箭头数值增加或减少的多少(步长)。默认值为1.0

3.format

当使用from和to属性限制数值时格式化数值,值格式:“%[宽度].[精度]f”

# 精度是小数点后几位

# 精确后的数值如果和当前数值一样则继续点击箭头不会使值增加

4.values

指定数值的字符串集,实测传入用空格分隔数值的字符串,或数值作为元素的列表或元组都可以

# 实测优先级比from, to高

5.wrap

如果为True,则当数值到最大值时再次点击箭头会环绕到最低值,否则不会。默认值为False

6.command

当用户点击箭头按钮时的回调函数

7.buttonbackground

箭头按钮的背景色。默认值由系统指定

8.buttoncursor

当鼠标移动到箭头按钮上时的鼠标样式

9.buttonuprelief, buttondownrelief

分别是上、下箭头的边框样式

# 实测无效

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

highlightbackground, highlightcolor, insertbackground, readonlybackground, selectbackground, selectforeground:默认值由系统指定

invalidcommand, invcmd, takefocus, textvariable, validatecommand, vcmd, xscrollcommand:默认值为空字符串

bd:默认值为1

borderwidth:默认值为1

cursor:默认值为'xterm'

exportselection:默认值为1

font:默认值为'TkTextFont'

highlightthickness:默认值为0

insertborderwidth:默认值为0

insertofftime:默认值为300

insertontime:默认值为600

insertwidth:默认值为2

justify:默认值为'left'

relief:默认值为'sunken'

repeatdelay:默认值为400

repeatinterval:默认值为100

selectborderwidth:默认值为0

state:默认值为'normal'

validate:默认值为'none'

width:默认值为20。注意单位是字符数

# 验证功能见输入控件

(6)、方法

1.invoke(element)

如果箭头按钮element状态不是disabled且command已指定,则调用command并返回结果

element——可以是'buttonup', 'buttondown'或'none'

# 注意这会使数值增加或减少

2.selection_element(element=None)

无参数调用将显示当前被按下的箭头按钮

element——值同invoke()。如果被指定则会使element显示被按下

# 同时只有一个箭头按钮能显示被按下

 

支持XView

其他方法见输入控件

示例:

运行结果:


十七、消息控件(Message)

(1)、概念

消息控件类似于标签控件,区别是它增加了自动分行的功能。所有文本以相同字体显示(不同字体见“文本框控件(Text)”)

# 将标签控件指定wraplength属性项和justify属性项也可达到近似相同的效果

(2)、演示图

(3)、构造方法

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

(4)、属性项

anchor, aspect, background, bd, bg, borderwidth, cursor, fg, font, foreground, highlightbackground, highlightcolor, highlightthickness, justify, padx, pady, relief, takefocus, text, textvariable, width

1.aspect

指定宽度比高度的百分比

# 例如如果值为100,则消息控件的宽度近似于高度;如果值为200,则消息控件的宽度是高度的二倍,如果值为50则反之

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

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

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

anchor:默认值为'center'

bd:默认值为1

borderwidth:默认值为1

font:默认值为'TkDefaultFont'

highlightthickness:默认值为0

justify:默认值为'left'

padx:默认值为-1

pady:默认值为-1

relief:默认值为'flat'

takefocus:默认值为0

width:默认值为0。注意单位是像素,且实测信息控件的大小会根据文本的大小而改变,但标签控件不会

示例:

运行结果:


十八、文本框控件(Text)

(1)、概念

文本框控件用于显示和编辑多行文本,允许用户以不同的样式、属性来显示和编辑文本。它可以包含纯文本或格式化文本,同时支持嵌入图片等

# 本章中“行”, “段”或“逻辑行”(logical lines)代表文本框控件中用回车换行的文本,而“行文本”或“显示行”(display lines)代表显示在文本框中一行之内的文本。例如这个注释是一段,有三行文本

(2)、演示图

(3)、构造方法

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

(4)、属性项

autoseparators, background, bd, bg, blockcursor, borderwidth, cursor, endline, exportselection, fg, font, foreground, height, highlightbackground, highlightcolor, highlightthickness, inactiveselectbackground, insertbackground, insertborderwidth, insertofftime, insertontime, insertunfocussed, insertwidth, maxundo, padx, pady, relief, selectbackground, selectborderwidth, selectforeground, setgrid, spacing1, spacing2, spacing3, startline, state, tabs, tabstyle, takefocus, undo, width, wrap, xscrollcommand, yscrollcommand

1.blockcursor

是一个布尔值,指定插入光标是否绘制成一个字符大小的矩形方块。默认值为False,即一条细的垂直线

# 这个矩形方块外观相当于cmd中点击Insert后的光标外观

2.inactiveselectbackground

当窗口没有焦点时选定区的颜色。如果为空则窗口没有焦点不显示选定区

# 选定区是选定文本的区域

3.insertunfocussed

指定当控件没有焦点时插入光标的样式。'none'(默认)代表不显示光标,'hollow'代表空心方块,'solid'代表实心方块

当blockcursor为False时,'hollow'与'solid'基本没区别

示例:

blockcursor为True:

inactiveselectbackground为'red'失去焦点时:

blockcursor为True,insertunfocussed为'hollow'失去焦点时:


4.startline, endline

都是一个整数的行索引,代表底层文本数据存储的行。startline代表储存的第一行,endline代表储存的内容最后一行的之后一行。指定空字符串可以重置它们一开始代表的行

设置startline和endline可以显示文本框较大文本中的一部分

示例:

指定startline=5, endline=8后:

指定startline='', endline=''后:

5.wrap

指定如果处理过宽的行文本。'none'代表每行文本正好显示为一段,'char'(默认)代表过长的每行文本会在任意字符断开,'word'代表过长的每行文本会在适合的最后一个单词断开

# “一个单词”是指任何数量相邻字母、数字或下划线组成的字符串

示例:

'none':

'char':

'word':

6.spacing1

指定每行文本上方的空白间隔(段前间距)。默认值为0

7.spacing2

指定每行文本自动换行的各行之间的空白间隔。默认值为0

8.spacing3

指定每行文本下方的空白间隔(段后间距)。默认值为0

9.undo

是否启用撤销功能,默认值为False

# 实际上也是是否启用重做功能

10.maxundo

允许撤销的数量,值为-1代表无限次

11.autoseparators

指定在撤销功能启用后,是否自动插入撤销分隔符(分隔操作记录)

# 撤销/重做机制的概述见后文“撤销/重做机制”


12.tabs

设置Tab之间的停顿

默认一个Tab是八个字符

设置特定的Tab,则要将该属性项值设置为一个序列,序列中的元素是相对于控件左边缘的距离(不包括边框)

序列中的元素应是正数且是递增的

元素后面可以跟一个字符串,代表Tab后文本的对齐方式:

'left'(默认):Tab后的文本左边缘与Tab位置对齐

'right':Tab后的文本右边缘与Tab位置对齐

'center':Tab后的文本在Tab位置的中间

'numeric':Tab后的文本如果有小数点,则最右端的小数点与Tab位置对齐;如果没有小数点,最左端数字的最小位右边缘与Tab位置对齐;如果没有数字,则文本右边缘与Tab位置对齐

 

如果序列没有足够的元素则会使用最后元素的间隔和对齐方式推断后面的Tab

如果属性项没有指定或序列为空,则使用默认值

补充:使用tkinter.font模块Font类的measure方法乘以4,可以设置Tab是4个字符

13.tabstyle

指定一行中Tab停顿与该行文本中Tab的关系,可以是以下值:

'tabular':一行文本中每个Tab字符与每个Tab停顿互相关联。如果Tab字符处于Tab停顿的右边,则会插入一个空格

'wordprocessor':一行文本中每个Tab字符与右边的第一个Tab停顿相关联

示例1:

默认停顿:

tabs=('1c', '3c', '7c'):

tabs=('1c', '3c', RIGHT, '7c'):  # three移动到Tab的左边

tabs=('1c', '3c', NUMERIC, '7c'):  # '.'移动到Tab位置

示例2:

tabstyle=('tabular'):

tabstyle=('wordprocessor'):

# 当为'tabular'时,第三组超过Tab停顿插入一个空格;当为'wordprocessor'时,第三组超过Tab停顿移到右边下一个Tab停顿

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

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

takefocus, xscrollcommand, yscrollcommand:默认值为空字符串

bd:默认值为1

borderwidth:默认值为1

cursor:默认值为'xterm'

exportselection:默认值为1

font:默认值为'TkFixedFont'

height:默认值为24

highlightthickness:默认值为0

insertborderwidth:默认值为0

insertofftime:默认值为300

insertontime:默认值为600

insertwidth:默认值为2

padx:默认值为1

pady:默认值为1

relief:默认值为'sunken'

selectborderwidth:默认值为0

state:默认值为'normal'

width:默认值为80

(6)、索引

使用索引指定字符在文本框中的位置

# 除非指定display,否则索引只对应当前显示的字符,不会对应被省略隐藏的字符

1.格式

"base modifier modifier modifier ..."

# 空格不是必要的

2.base

索引的开始,可以是以下形式

2.1.line.char

对应line行中的第char个字符。line从1开始,char从0开始

如果char为'end',则是line行结束处的换行符

2.2.@x,y

对应文本框X和Y坐标的字符

2.3.end

对应文本框结束的字符(最后一个换行符之后的一个字符)

# 标记mark和标签tag见后文

2.4.mark

对应标记名为mark的字符

2.5.tag.first

对应文本框控件中第一个标签为tag的字符

2.6.tag.last

对应文本框控件中最后一个标签为tag的字符

2.7.嵌入对象

对应嵌入到文本框控件中的图像或控件

3.modifier

通过modifier修饰索引,可以是以下形式

# 空格不是必要的(除了字母之间的空格),[]中代表可选,/表示多选1,modifier中的字符串可以缩写

3.1.+/- count [display/any] chars

将索引按字符向后/前移动,count指定移动的字符数

如果指定display,则被省略的字符会被跳过而不被计算在内;如果指定any,则任何字符都会被计算在内(但图像和控件不会);否则是以索引位置进行计算

# 由于历史原因,需要指定any才是按字符移动

3.2.+/- count [display/any] indices

将索引按索引位置向后/前移动,count指定移动的字符数

如果指定display,则被省略的索引会被跳过而不被计算在内;如果指定any(默认),则任何索引都会被计算在内

3.3.+/- count [display/any] lines

将索引按行向后/前移动,count指定移动的行数

如果指定display,则显示行会被计算在内;如果指定any(默认),则每个逻辑行只会被计算一次


3.4.[display] linestart

将索引调整为该行第一个索引

如果指定display,则是显示行第一个索引,否则是逻辑行第一个索引

3.5.[display] lineend

将索引调整为该行最后一个索引

如果指定display,则是显示行最后一个索引,否则是逻辑行最后一个索引

3.6.[display] wordstart

将索引调整为当前索引所在单词的第一个字符

如果指定display,则被省略的字符会被跳过而不被计算在内,否则任何字符都会被计算在内

3.7.[display] wordend

将索引调整为当前索引所在单词的最后一个文本之后的字符

如果指定display,则被省略的字符会被跳过而不被计算在内,否则任何字符都会被计算在内

示例:

文本:

01234567890123456789012345678901234567890123456789

0123456789

abc def ghij

0123456789

0123456789

0123456789

属性项:

font=('黑体', 20), width=35, height=8

结果图:

索引:  # “-->”后的是对应字符和“line.char”索引

1.2 --> '2' (1.2)

2.2 --> '2' (2.2)  # 结果图中的第二逻辑行是第三显示行

end --> '' (7.0)

1.2 + 3 any chars --> '5' (1.5)  # 可缩写为'1.2+3a c'

1.2 + 3 any line --> '2' (4.2)

1.2 + 3 display line --> 'c' (3.2)  # 第一逻辑行的第二显示行计算在内

1.0 display lineend --> '4' (1.34)

3.8 wordend --> '\n' (3.12)  # 最后一个文本之后的字符是换行符


(7)、基本方法

1.bbox(index)

返回元组(x, y, width, height)描述索引index对应字符的矩形边界

如果字符在屏幕上不可见则width, height为0

2.compare(index1, op, index2)

比较index1和index2的索引位置,返回布尔值

op——关系运算符,值是'<', '<=', '==' '>=', '>', '!='中的一个

如果index1和index2对应文本同一字符,则它们是相等的;如果index1对应的字符在index2对应的字符之前,则index1 < index2

3.delete(index1, index2=None)

删除区间[index1, index2)之间的字符。如果只给出index1,则只删除index1对应的字符;如果index1 > index2,则不会删除任何字符

4.get(index1, index2=None)

返回区间[index1, index2)之间的字符。如果只给出index1,则只返回index1对应的字符;如果index1 > index2,则不会返回任何字符

嵌入对象将被忽略,多行文本会用'\n'分隔

5.index(index)

返回index索引对应的'line.char'形式

6.insert(index, chars, *args)

在index处插入文本chars。如果提供额外参数,则第一个参数视为标签添加到chars上(如果是可迭代对象则是每个元素(字符串除外)),后面可以再加多组这样的chars-tags对

示例:

insert(1.0, 'aaaa', ['tag_a', 'tag_b'], 'bbbb', 'tag_b')意为在1.0处插入aaaabbbb,其中aaaa被添加tag_a和tag_b索引,bbbb被添加tag_b索引

7.see(index)

滚动视图使index可见

(8)、标记

· 标记是文本框中的某个浮动的位置,处于两个字符之间,它会与相邻的文本浮动

· 删除标记周围文本不会删除标记

· 实测标记名可以是任何字符串,但建议最好不要与像'end', '1.0'之类的索引重名

· 特殊标记'insert'是插入光标的位置,'current'是最接近鼠标指针的位置

1.标记重力

标记是处于两个字符之间的位置,标记重力指定当文本插入到标记位置时标记附着的字符,它的方向是'left'或'right'

2.标记相关方法

2.1.mark_gravity(markName, direction=None)

只传入markName参数则返回对应标记的重力方向

如果传入direction,则它需是'left'或'right',用于改变标记的“重力”方向

2.2.mark_set(markName, index)

如果名为markName的标记不存在,则以'right'的重力创建一个标记,并移动到index位置

如果存在,则将名为markName的标记移动到index位置

2.3.mark_unset(*markNames)

删除markNames中的所有标记

# 特殊标记'insert'和'current'不能被删除

2.4.mark_names()

返回控件中所有标记名组成的元组,包括'insert'和'current'


2.5.mark_next(index)

返回索引index后面的标记名称,实测无标记返回None

如果index是一个标记名,则是该标记的名之后的一个标记

2.6.mark_previous(index)

返回索引index前面的标记名称,实测无标记返回None

如果index是一个标记名,则是该标记的名之前的一个标记

(9)、标签

· 标签是字符串,可以包含任何字符,但最好避免是'end', '1.0'之类的名称

· 一个标签可以与任何数量的字符相关联,一个字符也可以与任何数量的标签相关联

· 标签能控制相关联字符的外观和功能

· 标签之间有一个优先顺序,拥有更高优先顺序的标签,它所对应的属性项优先应用

· 特殊标签'sel',代表当前选定区的文本

1.标签相关方法

1.1.tag_add(tagName, index1, *args)

将标签tagName与区间[index1, args中第一个位置参数)相关联,后面可以再加多组这样的位置参数。如果最后一组这样的参数不成对,则关联最后一组前面参数的单个字符

1.2.tag_remove(tagName, index1, index2=None)

将标签tagName从区间[index1, index2)中删除。如果只给出index1,则只删除index1对应的单个字符

1.3.tag_delete(*tagNames)

删除tagNames中的所有标签

1.4.tag_names(index=None)

返回index对应字符关联的所有标签名组成的元组。无参数调用返回文本框控件中的所有标签(包括特殊标签'sel')

1.5.tag_configure(tagName, cnf=None, **kw)

# 别名:tag_config

与控件的configure()相似,这里是修改标签TagName的属性项

1.6.tag_cget(tagName, option)

以字符串形式返回标签的属性项option的值

1.7.tag_raise(tagName, aboveThis=None)

将标签tagName的优先顺序升到标签aboveThis的上面

省略aboveThis则将其优先顺序升到最高

1.8.tag_lower(tagName, belowThis=None)

将标签tagName的优先顺序降到标签aboveThis的下面

省略aboveThis则将其优先顺序降到最低

1.9.tag_ranges(tagName)

以元组形式返回描述tagName相关联字符的范围

元组中每两个元素描述一个范围区间[arg1, arg2)

1.10.tag_nextrange(tagName, index1, index2=None)

在区间[index1, index2)中从左向右搜索第一个标签tagName关联字符范围的初始索引,以元组形式返回此初始索引对应的范围

如果省略index2,则index2默认是文本框末尾;如果搜索无结果则返回空元组

# 范围的“初始索引”指范围区间[arg1, arg2)中的arg1

1.11.tag_prevrange(tagName, index1, index2=None)

在区间[index2, index1)中从右向左搜索第一个标签tagName关联字符范围的初始索引,以元组形式返回此初始索引对应的范围

如果省略index2,则index2默认是文本框开头;如果搜索无结果则返回空元组


示例:

文本框内容:012345678901234567890123456789

调用控件方法:

tag_add('my_tag', '1.1', '1.5', '1.8', '1.9', '1.12', '1.15')  # 将'my_tag'标签关联到后面范围

tag_config('my_tag', background='green')  # 将'my_tag'标签关联字符的背景色变为绿色

当前结果:

调用控件方法:

tag_nextrange('my_tag', '1.2', '1.13') --> ('1.8', '1.9')

tag_prevrange('my_tag', '1.13', '1.2') --> ('1.12', '1.15')

# 从'1.2'到'1.13',('1.8', '1.9')中初始索引'1.8'是第一个被包含的;从'1.13'到'1.2',('1.12', '1.15')中初始索引'1.12'是一个被包含的

1.12.tag_bind(tagName, sequence, func, add=None)

同控件方法bind()

# 更多信息见章节“事件处理”

1.13.tag_unbind(tagName, sequence, funcid=None)

同控件方法unbind()

# 更多信息见章节“事件处理”

2.标签属性项

使用tag_config()修改标签的属性项可以改变相关联文本的外观

2.1.background

指定背景色

2.2.foreground

指定前景色

2.3.bgstipple

指定背景填充的位图,空字符串(默认值)表示实心

2.4.fgstipple

指定前景填充的位图,空字符串(默认值)表示实心

2.5.borderwidth

指定边框宽度

2.6.relief

指定边框样式

2.7.elide

是否被省略。省略的数据(字符、图像、嵌入控件)不会显示,但进一步的行为和正常数据一样

2.8.font

指定字体

2.9.justify

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

# 显示行的对齐方式由第一个非省略字符的此属性值决定

2.10.lmargin1

指定首行缩进的像素

2.11.lmargin2

指定后续行缩进的像素

2.12.lmargincolor

指定缩进的背景色

2.13.rmargin

指定文本右缩进的像素

2.14.rmargincolor

指定文本右缩进的背景色

2.15.offset

指定文本的基线与所在行的基线在垂直方向上的偏移量,单位是像素。偏移量为正则是向上偏移,为负则上向下偏移

# 使用此属性可以做出上标和下标

示例:

文本内容:H2SO4 + 2NaOH = Na2SO4 + 2H2O

调用控件方法:

tag_add('subscript', '1.1', '1.2', '1.4', '1.5', '1.18', '1.19', '1.21', '1.22', '1.27', '1.28')

tag_config('subscript', offset=-5)

当前结果:

2.16.underline

指定是否绘制下划线

2.17.underlinefg

指定下划线的颜色

2.18.overstrike

指定是否绘制删除线

2.19.overstrikefg

指定删除线的颜色

2.20.selectbackground

指定选定区的背景色

2.21.selectforeground

指定选定区的前景色

2.22.wrap

2.23.spacing1

2.24.spacing2

2.25.spacing3

2.26.tabs

2.27.tabstyle

见文本框控件中的同名属性项

(10)、嵌入对象

通过以下控件方法,可以在文本框中嵌入图像、控件,图像和控件都具有属性项

1.嵌入图像

1.1.相关方法

1.1.1.image_create(index, cnf={}, **kw)

在index处嵌入图像,传入键值对设置图像的属性项,返回一个唯一的标识符(用作索引)

1.1.2.image_configure(index, cnf=None, **kw)

与控件的configure()相似,这里是修改index对应图像的属性项

1.1.3.image_cget(index, option)

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

1.1.4.image_names()

返回当前文本框中嵌入图像名称组成的元组

1.2.属性项

1.2.1.align

指定图像在行中的显示位置,可选择以下的值:

'top':图像顶部与行的顶部对齐

'center':图像在行内居中

'bottom':图像底部与行的底部对齐

'baseline':图像底部与行的基线对齐

示例:  # 蓝色矩形高度小于行高

1.2.2.image

指定图像对象

1.2.3.name

指定嵌入图像的标识符名(重复标识符会将#nn附加到后面)

1.2.4.padx

指定水平外边距(嵌入对象周围的空白区域),单位是像素

1.2.5.pady

指定垂直外边距,单位是像素

2.嵌入控件

# 注意,如果嵌入控件的堆叠顺序在文本框控件之下,则不会显示

# 注意,一个控件同时只能在一个控件中被包装,如果想要一次创建多个控件建议使用create属性项

2.1.相关方法

2.1.1.window_create(index, cnf={}, **kw)

在index处嵌入控件,传入键值对设置控件的属性项,返回None

2.1.2.window_configure(index, cnf=None, **kw)

# 别名:window_config

与控件的configure()相似,这里是修改index对应控件的属性项

2.1.3.window_cget(index, option)

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

2.1.4.window_names()

返回当前文本框中嵌入控件名称组成的元组

2.2.属性项

2.2.1.create

指定一个函数,函数的返回值将作为嵌入到文本框的控件

2.2.2.stretch

指定一个布尔值,表示控件是否被垂直拉伸以填充其行

# 这会使align属性被忽略。pady属性仍会起作用

2.2.3.window

指定控件对象

2.2.4.align

2.2.5.padx

2.2.6.pady

见嵌入图像中的同名属性项


(11)、撤销/重做机制与修改标志

1.撤销/重做机制

# 实测撤销/重做机制对嵌入对象无作用

文本框控件有一个无限制的撤销和重做机制,可以取消或恢复对控件内文本的编辑

下面是撤销/重做堆栈的工作方式:

· 对控件内文本的编辑动作(插入、删除)都会堆到撤销堆栈上

· 分隔符插入到编辑动作之间。分隔符可以自动插入(autoseparators为True),也可以手动插入(控件方法edit_separator())

· 撤销操作会反转所有堆到撤销/重做堆栈的编辑动作,直到达到一个分隔符或堆栈内容用完

· 撤销操作的反转操作会插入重做堆栈

· 每当有新的编辑动作记录在撤销堆栈时,重做堆栈会被清空

2.修改标志

· 通过文本框控件的修改标志可以追踪其内容变化

· 修改标志会在文本框内文本插入、删除、撤销操作、重做操作时被设置为1,表示文本内容被修改

· 修改标志可以使用edit_modified()方法查询、修改

3.相关方法

3.1.edit(*args)

文本内容编辑相关的方法,第一个参数指定模式(见下面的方法名),后面参数是对应方法的参数

# 模式还可以是'canundo'和'canredo',会返回撤销/重做堆栈是否不为空

3.2.edit_modified(arg=None)

无参数调用返回文本框控件修改标志的值。如果传入布尔值arg,则将文本框控件修改标志的值设置为arg

3.3.edit_undo()

执行一次撤销操作,当撤销堆栈为空时抛出TclError。只当undo属性为True时才起作用

3.4.edit_redo()

执行一次重做操作,当重做堆栈为空时抛出TclError。只当undo属性为True时才起作用

3.5.edit_separator()

向撤销堆栈插入一个分隔符。只当undo属性为True时才起作用

3.6.edit_reset()

清空撤销和重做堆栈

(12)、对等文本框控件(Peer text widgets)

# “对等文本框控件”为自译

1.概念

多个文本框控件,有相同的基础数据(文本、图像、标记、标签、...)但有着不同属性项,这样的文本框控件称为对等文本框控件(Peer text widgets)

2.特点

· 对等文本框控件基础数据共享,但'sel'标签、'insert'标记、'current'标记、嵌入式控件不是共享的

· 对等文本框控件可以设置不同属性项,但undo, maxundo, autoseparators除外

· 对等文本框控件通过设置startline和endline可以只显示某些行

· 对等文本框控件的“原始”文本框控件被删除后,不会影响其他对等控件


3.相关方法

3.1.peer_create(newPathName, cnf={}, **kw)

创建调用文本框控件的对等文本框控件,传入键值对设置不同的属性项

调用后,新控件的路径名称将是newPathName

newPathName必须不存在,否则抛出TclError异常

# 对等控件和“原始”控件的startline和endline属性默认相同

# 创建对等文本框控件,可以先创建一个控件,再调用它的destroy()销毁它,然后用此方法将它替换成对等文本框控件

3.2.peer_names()

返回调用文本框控件的对等文本框控件元组(不包括自己)

示例:

运行结果:

随便修改一个文本框内容后:


(13)、更多方法

1.count(index1, index2, *args)

计算并以元组形式返回index1和index2之间(不包括index2)由args给出的每个计数项的数量。如果index1在index2之后,则计数结果是负数

计数项如下:

'indices'(默认):计算所有的字符和嵌入对象

'displayindices':计算所有的非省略字符和嵌入对象

'chars':计算所有的字符

'displaychars':计算所有的非省略字符

'lines':计算所有的逻辑行,不包括index2所在的行

'displaylines':计算所有的显示行,不包括index2所在的行

'xpixels':计算index1到index2之间水平字符(不包括index2)最左边像素到最右边像素的水平像素数量

'ypixels':计算index1到index2之间垂直字符(不包括index2)最上边像素到最下边像素的水平像素数量

# 实测'xpixels'和'ypixels'需要先更新控件才能正常计数

示例:

运行结果:  # 图片没有缩放,但在插入图片时可能会模糊

 

2.dlineinfo(index)

返回一个五元组,该元组描述索引index所在显示行的矩形区域。前两个元素是这个矩形的左上角x和y坐标,三、四元素是该矩形的宽度和高度,第五个元素是从矩形上到下的基线位置。单位都是像素

如果索引index所有的显示上在屏幕上不可见,则返回None

3.dump(index1, index2=None, command=None, **kw)

返回区间[index1, index2)中内容组成的三元组列表。如果只给出index1,则只是index1对应内容组成的三元组列表

内容包括:文本、标记、标签、图像、控件

通过关键字参数,如果指定'all', 'image', 'mark', 'tag', 'text'或'window'中一个多个为真,则返回相应内容。没有指定则默认使用'all'

返回结果是一个三元组列表,三元组形为(key, value, index),分别是类型、值、索引。这个三元组列表是按照内容顺序的。类型tagon表示标签范围开始、类型tagoff表示标签范围结束

command——是一个函数。如果给出,则三元组列表的每个三元组都会传入三个位置参数调用该函数,且返回值变为None

示例:

运行结果:

[('tagon', 'red', '1.0'), ('text', '012', '1.0'), ('tagoff', 'red', '1.3'), ('text', '3456789', '1.3')]

[('tagon', 'red', '1.0'), ('tagoff', 'red', '1.3'), ('tagon', 'red', '2.3'), ('tagoff', 'red', '2.6'), ('tagon', 'red', '3.6'), ('tagoff', 'red', '3.9')]

在索引2.0处读取内容012,类型:text

在索引2.3处读取内容red,类型:tagon

在索引2.3处读取内容345,类型:text

在索引2.6处读取内容red,类型:tagoff

在索引2.6处读取内容6789,类型:text

4.search(pattern, index, stopindex=None, forwards=None, backwards=None, exact=None, regexp=None, nocase=None, count=None, elide=None)

从index开始查找符合pattern的文本,默认返回匹配文本的第一个字符的索引

指定以下参数值为True来控制查找:

forwards(默认):从index(包含)开始从左向右查找

backwards:从index(不包含)开始从右向左查找

# 由于各种原因,backwards会比forwards慢得多

exact(默认):匹配文本必须与pattern的文本相同

regexp:将pattern视为正则表达式

nocase:忽略大小写

elide:查找省略的字符

count——指定一个控制变量,将匹配文本的字符数存储到该控制变量中。指定会方法返回空字符串

stopindex——指定查找停止的索引。如果是forwards则不包含,如果是backwards则包含

5.replace(index1, index2, chars, *args)

将区间[index1, index)之间的文本替换成chars。关于args参见insert()方法

 

支持XView和YView

补充:tkinter包内模块scrolledtext

这个模块提供一个名为ScrolledText的类,这个类继承自Text类,但是多了一个y方向的滚动条

tkinter.scrolledtext.ScrolledText(master=None, **kw)

这个类的对象的frame属性是文本框控件和滚动条控件布局在其内的框架控件,vbar属性是滚动条控件















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

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