Tkinter (19) 文本部件 Text

文本部件的创建及其选项

部件主要作为处理多行字符串, 更可作为文本编辑器, 可以混合不同字体, 颜色, 图片(图片被视为单一字符处理), 也可以在文本部件中嵌入其他的部件, 该部件也被视为单一的字符.

text = tk.Text(parent, option, ...)
选项 说明
autoseparators undo=True 时, 是否在每次插入或删除后自动将分隔符添加到 undo 堆栈
bg or background 预设背景色
bd or borderwidth 外框的寛度, 内定为 2 点素
cursor 当鼠标移到部件处时,所显示的鼠标图示
exportselection 文本可否复制到剪贴板 0/1
font 预设文本字体
fg or foreground 预设文本及点阵图的颜色
height 根据 font 选项的行数
highlightbackground 非聚焦时的聚焦颜色
highlightcolor 聚焦时的聚焦颜色
highlightthickness 聚焦厚度,内定 1, 0 则无
insertbackground 插入光标的背景颜色,内定为黑色
insertborderwidth 插入光标外框寛度,内定为 0
insertofftime 插入光标消失的时间,内定为 300 ms
insertontime 插入光标显现的时间,内定为 600 ms
insertwidth 插入光标寛度,内定为 2 点素
maxundo 设置 undo 堆栈的最大保留次数, -1 为不限次数
padx 水平间距,内定为 1 点素
pady 垂直间距,内定为 1 点素
relief 外框花样,内定为 SUNKEN
selectbackground 被选择文本的背景颜色
selectborderwidth 被选择文本的外框寛度
selectforeground 被选择文本的前景颜色
spacing1 段落前距, 内定 0 点素
spacing2 段落中距, 内定 0 点素
spacing3 段落后距, 内定 0 点素
state NORMAL 或 DISABLED
tabs 定位符位置
takefocus TAB 键在部件是否会循环焦点 0/1
undo 是否可以 undo
width 部件的寛度 (标准字寛)
wrap 换行的方法, 内定为 CHAR, WORD, NONE
xscrollcommand 水平滚动条 scrollbar.set () 方法
yscrollcommand 垂直滚动条 scrollbar.set () 方法

文本部件的索引方式

索引 index 指连续两个字符中间的位置, 以字符串代表值.

选项 说明
line.column 字符串, 第line行 (从 1 开始), 第column位置 (从 0 开始)
line.end 字符串, 第 line 行最后处
tk.INSERT 插入光标位置, 同 ‘insert’
tk.CURRENT 最近鼠标位置, 同 ‘current’
tk.END 文本最后的位置, 同 ‘end’
tk.SEL_FIRST 选择区的起点, 同 ‘sel.first’
tk.SEL_LAST 选择区的终点, 同 ‘sel.last’
markname 字符串, 使用标记名的标记的位置
tag.first 字符串, 标签的起点
tag.last 字符串, 标签的终点
@x,y 字符串, 最接近座标位置 (x, y) 的字符前
embedded-object 内嵌部件前

注: 以下内容可以加入以上索引, 取得更复杂的索引方式, 空格可省略, 可跨行.

选项 说明
+ n chars(c) 向后 n 个字符
- n chars(c) 向前 n 个字符
+ n lines(l) 向上 n 行, 如果长度不够, 会在行尾
- n lines(l) 向下 n 行, 如果长度不够, 会在行尾
linestart 行前
lineend 行后
wordstart 索引所在的字前

文本部件的标记 (mark)

标记为一不含句点及空格的字符串, 用来代表一个索引值, 比如 tk.INSERT, tk.CURRENT. 如果内文修改不影响标记相邻部份, 标记的位置不会改变.
标记有个定位方式 Gravity, 可以是 tk.LEFT 或 tk.RIGHT, 在标记处插入新字符串时, 前者标记保留在左侧, 后者则标记保留在右侧.
删除含有标记的字符串, 不会删除标记.

文本部件的标签 (tag)

标签tag 用来代表具有某些相同选项(如字体, 颜色, 事件等) 项目不含句点及空格的字符串, 用来代表某一群具有某些同样选项的项目, 比如tk.SEL 代表被选择的文本项目.
每个项目可以对应多个标签, 同样标签也可以对应多个项目, 如果不同的标签对应到同一个项目, 其选项的设置不同, 因为标签是以堆栈方式来管理, 因此以后设的标签选项而定.

文本部件的定位符

内定的定位符位置是8 个字符, 自定例如tabs=(‘3c’, ‘5c’, ‘12c’), 后面的所有定位符位置将是同距于定位符间的最后一个距离(12c - 5c = 7c)
内定的定位方式是左边对齐tk.LEFT, 也是可是tk.RIGHT, tk.CENTER, tk.NUMERIC (小数点对齐), 例如tabs=(‘3c’, ‘5c’, tk.RIGHT, ‘12c’, tk.CENTER)

文本部件的方法

方法 说明
bbox(index) 取得输入区字符串索引index 所在的字符,左上角的座标(x, y), 寛度/ 高度w/h, 返回(x, y, w, h), 如果没有字则返回None, 如果未更新update_idletasks(), 可能不会取得准确的资讯
compare(index1, op, index2) 比较两个索引的位置, op 为 ‘<’, ‘<=’, ‘==’, ‘!=’, ‘>=’, or ‘>’
delete(index1, index2=None) 删除索引 index1 处的字符, 或 index1 处到 index2 处前的字符串
dlineinfo(index) 取得索引index 所在的行,左上角的座标(x, y), 寛度/ 高度w/h, 返回(x, y, w, h), 如果没有字则返回None,如果未更新update_idletasks(), 可能不会取得准确的资讯
edit_modified(arg=None) 无参数返回, True 设置, False 清除文本修改的旗标, 旗标以部件内容有无修改为准
edit_redo() 执行 redo
edit_reset() 清除 undo 堆栈
edit_separator() 放一个 seperator 进堆栈, 用来界定下一个 undo 的还原步骤范围
edit_undo() 执行 undo (所有上回放入 seperator 后的改变, 如果没有 seperator, 则 undo 全部), 空的 undo 堆栈会引起错误
image_create(index[, option=value, …]) 在索引的地方插入图片, 选项有
align 垂直对齐位置top/center/bottom/baseline (文本的底线)
image 图片< br>name 图片的名称, 没有设置会产生为#number
padx 左右间隔
pady 上下间隔
get(index1, index2=None) 返回索引index1 处的字符, 或index1 处到index2 处前的字符串, 其中的图片及部件都会被省略, 只返回文本部份, 多行以’\n’来表示
image_cget(index, option) 返回索引所指图片的某选项值
image_configure(index, option, …) 设置索引所指图片的各选项值, 无选项则返回选项值的字典
image_names() 返回文本部件中所有图片的名称 tuple
index(i) 返回相关位置的索引值’line.char’, 参数有END (行末), INSERT (插入点), ANCHOR, SEL_FIRST (前选择点), SEL_LAST (后选择点), “@x ”(近x 处)
insert(index, text, *tags) 在索引处插入字符串, 加入 tags 标签中, 在插入处前后文本的标签都会被忽略; 如果没有给标签, 则会被加上去
mark_gravity(mark, gravity=None) 设置或返回一个标记 mark 的定位方式 gravity, tk.LEFT 或 tk.RIGHT
mark_names() 返回文本部件中所有的标记名称, 包含 tk.INSERT 及 tk.CURRENT
mark_next(index) 返回索引处后的标记名称, 无则返回空符; 如果索引是一个数值, 返回的是在该位置的第一个标记, 如是索引是一个标记, 则返回下一个标记,该标记可能会是在同一个数值位置
mark_previous(index) 返回索引处前的标记名称, 无则返回空符; 如果索引是一个数值, 返回的是在该位置的最后一个标记, 如是索引是一个标记, 则返回前一个标记, 该标记可能会是在同一个数值位置
mark_set(mark, index) 设置在索引处的标记, 如果是新的标记, 将具有tk.RIGHT 的定位方式, 如果是已有的标记, 将会移到该新的位置, 这个方法可能会改变tk.INSERT/tk.CURRENT 的位置
mark_unset(mark) 移除标记名, 不含 tk.INSERT 及 tk.CURRENT
scan_dragto(x, y) 鼠标键按下事件处理程序中已标记位置时, 鼠标滚动事件处理程序拖弋卷动部件, (x, y) 为位置
scan_mark(x, y) 鼠标键按下事件处理程序中标记位置 (x, y)
search(pattern, index, option, …) 按pattern (字符串或正则式) 从索引处开始搜索, 如果成功, 返回’line.char’, 否则返回空字符
选项有:
backwards - 反向搜索吗, 内定为False
count - tk.IntVar() 用来使用该变量的get() 方法, 得到符合pattern 的字符串长度
exact - 设置True 使搜索必须完全符合
forwards - 设置正向搜索, 内定为True
regexp - 设True 以使用Tcl 式的正则式, 内定为完全匹配, Tcl 式为python 正则式的字集, 支持. ^ [c1 …] (…) * + ? e1|e2
see(index) 卷动部件, 使索引位置可见
tag_add(tagName, index1, index2=None) 关连标签名 tagName 到索引 index1 处的字符, 或 index1 处到 index2 处前的字符串
tag_bind(tagName, sequence, func, add=None) 绑定标签tagName 的事件sequence 到回调函数func, add ‘+’ 为增加新的函数, 否则为取代所有旧的函数; 只有前两个参数,则返回事件相关的函数; 只有第一个参数, 则返回所有相关函数的列表
tag_cget(tagName, option) 返回标签的选项值
tag_config(tagName, option, …) 设置各选项的值, 没选项时, 则以字典的方式返回全部的选项值
选项如下
background - 背景色, 不能使用bg
bgstipple - 在设置背景色的情况下, 为使背景可以显示灰化, 设置为一个标准的点阵图名
borderwidth - 标签所代表的文本外框寛度, 内定为0, 不能使用bd
fgstipple - 为使前景可以显示灰化, 设置为一个标准的点阵图名
font - 文本的字体
foreground - 前景色, 不能使用fg
justify - 多行文本的对齐方式,LEFT (内定) /RIGHT/CENTER
lmargin1 - 第一行的缩格, 内定为0
lmargin2 - 其他行的缩格, 内定为0
offset - 文本上移(正值)或下移(负值)量, 以文本的基准线为参考点, 比如上标或下标
overstrike - 是否画上文本的水平中线, 比如删除线
relief - 花边样式, 内定为FLAT
rmargin - 右边的缩格量, 内定为0
spacing1 - 前垂直间距, 内定为0
spacing2 - 内垂直间距, 内定为0
spacing3 - 后垂直间距, 内定为0
tabs - 设置定位符的位置
underline - True 设置下底线
wrap - 换行的长度
tag_delete(tagName, …) 删除标签名, 其相关的绑定, 选项, 字符串的关连性都会移除
tag_lower(tagName, belowThis=None) 下移标签 tagName 至 belowThis 标签下方, 无 belowThis, 则移到标签堆栈的最下方
tag_names(index=None) 返回索引处所有相关的标签名, 或者文本部件内所有的标签名
tag_nextrange(tagName, index1, index2=None) 从索引index1 开始到index2 (或到文本结束处), 如果存在tagName 标签, 返回(i0, i1), i0 为第一个起始位置, i1 为最后一个结束位置. 没有则返回空字符
tag_prevrange(tagName, index1, index2=None) 从索引index1 之前到index2 (或到文本结束处), 如果存在tagName 标签, 返回(i0, i1), i0 为第一个起始位置, i1 为最后一个结束位置. 没有则返回空字符
tag_raise(tagName, aboveThis=None) 上移标签 tagName 至 aboveThis 标签上方, 无 aboveThis, 则移到标签堆栈的最上方
tag_ranges(tagName) 返回标签名所有的文本位置列表 [s0, e0, s1, e1, …], si 为索引起点, ei 为索引终点
tag_remove(tagName, index1, index2=None) 移除从索引 index1 (到 index2) 的标签名 tagName
tag_unbind(tagName, sequence, funcid=None) 移除标签名的绑定事件回调函数
window_cget(index, option) 返回嵌入文本中索引处部件的选项值
window_configure(index, option) 设置嵌入文本中索引处部件的各选项值, 或返回全部选项的字典值
window_create(index, option, …) 在索引处建立部件及其选项值, 或使用回调来建立部件
选项有
align - 设置部件垂直的定位, CENTER (内定), TOP , BOTTOM, BASELINE
create - 建立子部件的无参数回调函数, 该部件必须是文本部件的子部件, 该函数返回该子部件
padx - 子部件左右间隔, 内定为0
pady - 子部件上下间隔, 内定为0
stretch - 如果行高比子部件高, 是否拉长子部件, 内定为0, 1 则为拉长, 而且align 选项将为无效
window - 嵌入文本中的子部件, 该部件必须是文本部件的子部件
window_names() 返回文本部件中所有子部件的名称列表
xview(tk.MOVETO, fraction) 供水平滚动条 scrollbar 选项 command 使用,fraction 0.0 为最左处, 1.0 为右处
xview(tk.SCROLL, n, what) 水平滚动画布 n 个单位,单位 what 为 tk.UNITS (字符) 或 tk.PAGES (页)
xview_moveto(fraction) 同 xview (tk.MOVETO, fraction)
xview_scroll(n, what) 同 xview (tk.SCROLL, n, what)
yview(tk.MOVETO, fraction) 垂直滚动画布,类似 xview (tk.MOVETO,…)
yview(tk.SCROLL, n, what) 垂直滚动画布,类似 xview (tk.SCROLL,…), tk.UNITS (行数)
yview_moveto(fraction) 垂直滚动画布,类似 xview_moveto()
yview_scroll(n, what) 垂直滚动画布,类似 xview_scroll ()

范例视窗及代码

Python

import tkinter as tk

def add_text(widget, sequence):
    global tags
    for i, (font, paragraph, color) in enumerate(sequence):
        tags[i]=f'tag_{i}'
        widget.insert(tk.END, paragraph+'\n', (tags[i],))
        widget.tag_configure(tags[i], foreground=color, font=font, spacing1=20)

tags = [None]*5

root = tk.Tk()
root.wm_title("Text Demo")

font12 = ('Courier New', 12)
font16 = ('Courier New', 16, 'bold')
font20 = ('Courier New', 20, 'bold')

t = [[font20, 'Demo Text', 'blue'],
     [font16, 'Chapter 1', 'red'],
     [font12, 'Python is an easy to learn, powerful programming language. '
              'It has efficient high-level data structures and a simple but '
              'effective approach to object-oriented programming. Python’s '
              'elegant syntax and dynamic typing, together with its interpreted '
              'nature, make it an ideal language for scripting and rapid '
              'application development in many areas on most platforms.', 'black'],
     [font16, 'Chapter 2', 'red'],
     [font12, 'This tutorial introduces the reader informally to the basic '
              'concepts and features of the Python language and system. It '
              'helps to have a Python interpreter handy for hands-on experience'
              ', but all examples are self-contained, so the tutorial can be '
              'read off-line as well.', 'black'] ]

text = tk.Text(bg='white', font=font12, width=80, height=20, bd=10, padx=5, pady=5)
text.grid(row=0, column=0)

add_text(text, t)
text.tag_config(tags[0], justify=tk.CENTER, underline=True)

root.mainloop()
本作品采用《CC 协议》,转载必须注明作者和本文链接
Jason Yang
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!