跳转至

§3.3 文本类控件

字数 911 个   代码 18 行   图片 8 张   阅读时间 3 分钟   访问量

一、文本类控件简述

1.1 什么是文本类控件

文本类控件就是功能主要与文本有关的一类控件,最典型的就是输入框控件了。由于涉及文本的相关功能多且复杂,因此 tkt 目前对文本类控件的支持还不是很好,某些功能还没有完全实现。

目前 tkt 内置的文本类控件有 InputBox 以及实验性支持的 SpinBox。但这两个都是对于单行文本进行操作的控件,关于多行文本的控件,将在未来加入 tkt。

1.2 它们是如何运作的

其实,tkt 的文本类控件不像前面章节讲的那些控件一样,文本类控件实现起来非常复杂,为了遵循 tkt 一切都是绘制出来的宗旨以及实现某些特殊的功能,tkt 不得不做了妥协,借用 tkinter 中相对底层的 API 来“重绘”文本类控件,而不是直接使用 tkinter 的文本控件。

文本类控件需要实现大量功能,如复制、剪切、粘贴、文本选中、光标显示、文本显示、换行处理、字符替换等等,其中最复杂的莫过于文本的显示和选中了。我们知道一个输入框应该是有一定范围的,超出这个范围的字符是不会显示的,但 tkt 中的一切都是用画布绘制的,只能绘制,无法擦除,导致 tkt 无法像其它 UI 框架那样直接限制文本的范围来呈现出一种文本被切割的样子,tkt 只能通过控制字符显示的数量来达到类似的效果。而不同字符的宽度并不相同,更别说还要根据字体来计算,这就极大地增加了实现文本显示以及文本选中的功能的难度。

1.3 目前存在的缺陷

目前 tkt 对于文本类控件还是实现了一定的基本功能,但仍存在一些问题,如文本选中不完善,无法选中“框外隐藏”的文本,这一功能同时导致了全选功能只能选中显示出来的文本,而非真正的全选。不过在未来会实现这个功能的,目前只是暂时未实现而已。

上述缺陷也间接导致了控件 SpinBox 只能实验性支持,因为其调整值的功能无法正常运作,徒有外观罢了。

二、文本类控件详述

2.1 InputBox

InputBox 就是输入框控件,是 tkinter 的控件 Entry 的平替,但相对 Entry 又有增强。我们可以通过设定其各个初始化参数来达到相应的要求,如通过设置参数 align 来设定文本的靠左、居中和靠右,设置参数 show 来替换原来显示的字符,设置参数 placeholder 来设定一个提示文本等。

下面是一个简单的示例,其设定一个提示文本,在控件内容为空且处于 "normal" 状态时,会以灰色显示这个提示文本:

1
2
3
4
5
6
7
8
9
import tkintertools as tkt

root = tkt.Tk()
cv = tkt.Canvas(root, zoom_item=True)
cv.place(width=1280, height=720)

tkt.InputBox(cv, (20, 20), placeholder="InputBox")

root.mainloop()

效果如下:

图1 输入框控件

图1 输入框控件

2.2 SpinBox

experimental:实验性支持,功能不完善且存在缺陷

从名称上就知道,这个控件对标的就是 tkinterSpinBox 控件,功能类似的,不再赘述。

下面是一个简单的示例:

1
2
3
4
5
6
7
8
9
import tkintertools as tkt

root = tkt.Tk()
cv = tkt.Canvas(root, zoom_item=True)
cv.place(width=1280, height=720)

tkt.SpinBox(cv, (20, 20))

root.mainloop()

效果如下:

图2 值输入控件

图2 值输入控件