mark_set()方法
Marks(标记)通常是嵌入到 Text 组件文本中的不可见对象。事实上 Marks 是指定字符间的位置(可以理解为一种索引),并跟随相应的字符一起移动。Marks 有 INSERT,CURRENT 和 user-defined marks(用户自定义的 Marks)。其中,INSERT 和 CURRENT 是 Tkinter 预定义的特殊 Marks,它们不能够被删除。
INSERT(或 "insert")用于指定当前插入光标的位置,Tkinter 会在该位置绘制一个闪烁的光标(因此并不是所有的 Marks 都不可见)。
CURRENT(或 "current")用于指定与鼠标坐标最接近的位置。不过,如果你紧按鼠标任何一个按钮,它会直到你松开它才响应。
你还可以自定义任意数量的 Marks,Marks 的名字是由普通字符串组成,可以是除了空白字符外的任何字符。使用 mark_set() 方法创建和移动 Marks。
如果你在一个 Mark 标记的位置之前插入或删除文本,那么 Mark 跟着一并移动(插入一个字符的话,Mark 向后移动了一个字符的位置)。
- 默认插入内容到 Mark,是插入到它的左侧,mark_gravity为LEFT时,是插入到他的右侧, 感觉是默认mark会'记住'后面元素的位置,mark_gravity为LEFT时,那就是'记住'前面的元素位置。
- 删除 Marks 的唯一办法是使用 mark_unset() 方法,删除 Mark 周围的文本并不会删除 Mark 本身(mark周围所有元素被删除时,会被初始化为1.0)。
from tkinter import *
root = Tk()
text = Text(root, width=50, height=30)
text.pack()
text.insert(INSERT, 'starting writing')
text.mark_set('here', '1.3', )
# text.mark_gravity('here', LEFT) # 改变mark的方向
text.insert('here', 'GOD')
text.insert('here', 'GUN')
text.mark_unset('here') # clear the mark
text.insert('here', 'CAR') # TclError: bad text index "here" as mark had gone
mainloop()
tags用法
Tags(标签)通常用于改变 Text 组件中内容的样式和功能。你可以修改文本的字体、尺寸和颜色。另外,Tags 还允许你将文本、嵌入的组件和图片与键盘和鼠标等事件相关联。除了 user-defined tags(用户自定义的 Tags),还有一个预定义的特殊 Tag:SEL(或 "sel" 用于表示对应的选中内容)
创建方法:
text.insert(INSERT, "I love this iphone13")
text.tag_add("tag1", "1.7", "1.12", "1.14") # 范围两个一组表示区间,单个的表示一个位置
text.tag_config("tag1", background="yellow", foreground="red")
Note: 可以直接使用tag_config()来创建一个不存在的tag, 但是指定不了范围
Tag_config() 参数
选项 | 含义 |
background | 1. 指定该 Tag 所描述的内容的背景颜色 2. 注意:bg 并不是该选项的缩写,在这里 bg 被解释为 bgstipple 选项的缩写 |
bgstipple | 1. 指定一个位图作为背景,并使用 background 选项指定的颜色填充 2. 只有设置了 background 选项该选项才会生效 3. 默认的标准位图有:'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass', 'info', 'questhead', 'question' 和 'warning' |
borderwidth | 1. 指定文本框的宽度 2. 默认值是 0 3. 只有设置了 relief 选项该选项才会生效 4. 注意:该选项不能使用 bd 缩写 |
fgstipple | 1. 指定一个位图作为前景色 2. 默认的标准位图有:'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass', 'info', 'questhead', 'question' 和 'warning' |
font | 指定该 Tag 所描述的内容使用的字体 |
foreground | 1. 指定该 Tag 所描述的内容的前景色 2. 注意:fg 并不是该选项的缩写,在这里 fg 被解释为 fgstipple 选项的缩写 |
justify | 1. 控制文本的对齐方式 2. 默认是 LEFT(左对齐),还可以选择 RIGHT(右对齐)和 CENTER(居中) 3. 注意:需要将 Tag 指向该行的第一个字符,该选项才能生效 |
lmargin1 | 1. 设置 Tag 指向的文本块第一行的缩进 2. 默认值是 0 3. 注意:需要将 Tag 指向该文本块的第一个字符或整个文本块,该选项才能生效 |
lmargin2 | 1. 设置 Tag 指向的文本块除了第一行其他行的缩进 2. 默认值是 0 3. 注意:需要将 Tag 指向整个文本块,该选项才能生效 |
offset | 1. 设置 Tag 指向的文本相对于基线的偏移距离 2. 可以控制文本相对于基线是升高(正数值)或者降低(负数值) 3. 默认值是 0 |
overstrike | 1. 在 Tag 指定的文本范围画一条删除线 2. 默认值是 False |
relief | 1. 指定 Tag 对应范围的文本的边框样式 2. 可以使用的值有:SUNKEN, RAISED, GROOVE, RIDGE 或 FLAT 3. 默认值是 FLAT(没有边框) |
rmargin | 1. 设置 Tag 指向的文本块右侧的缩进 2. 默认值是 0 |
spacing1 | 1. 设置 Tag 所描述的文本块中每一行与上方的空白间隔 2. 注意:自动换行不算 3. 默认值是 0 |
spacing2 | 1. 设置 Tag 所描述的文本块中自动换行的各行间的空白间隔 2. 注意:换行符('\n')不算 3. 默认值是 0 |
spacing3 | 1. 设置 Tag 所描述的文本块中每一行与下方的空白间隔 2. 注意:自动换行不算 3. 默认值是 0 |
tabs | 1. 定制 Tag 所描述的文本块中 Tab 按键的功能 2. 默认 Tab 被定义为 8 个字符的宽度 3. 你还可以定义多个制表位:tabs=('3c', '5c', '12c') 表示前 3 个 Tab 宽度分别为 3厘米,5厘米,12厘米,接着的 Tab 按照最后两个的差值计算,即:19厘米,26厘米,33厘米 4. 你应该注意到了,它上边 'c' 的含义是“厘米”而不是“字符”,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是 '1i' 等于 '72p') 5. 如果是一个整型值,则单位是像素 |
underline | 1. 该选项设置为 True 的话,则 Tag 所描述的范围内文本将被画上下划线 2. 默认值是 False |
wrap | 1. 设置当一行文本的长度超过 width 选项设置的宽度时,是否自动换行 2. 该选项的值可以是:NONE(不自动换行),CHAR(按字符自动换行)和 WORD(按单词自动换行) |
如果你对同一个范围内的文本加上多个 Tags,并且设置相同的选项,那么新创建的 Tag 样式会覆盖比较旧的 Tag:
tag_raise() / tag_lower() 可以改变优先级
tag支持事件绑定, see the example.
tag_bind('tag_name', '<event_name>', command)
移除tag:
tag_delete(*tagNames) -- 删除 tagNames 指定的 Tags
tag_remove(tagName, index1, index2=None)
-- 删除 index1 到 index2 之间所有的 tagName
-- 如果忽略 index2 参数,那么只删除 index1 指定的那个字符的 tagName(如果有的话)
from tkinter import *
import webbrowser
root = Tk()
t1 = Text(root, width=40, height=20)
t1.pack()
t1.insert('1.0', 'Iceberg Right Head!')
#创建两个tag
t1.tag_config('tag1', background='black', foreground='yellow')
t1.tag_config('tag2', background='gray')
# 新建的tag优先级比旧的高,可用tag_raise() or tag_lower()改变优先级
t1.insert(END, 'click me to escape', ('tag1', 'tag2')) # backgroud 会显示blue
# 创建新tag用于超链(click me)
t1.tag_add('tag3', '1.19', '1.27')
t1.tag_config('tag3', underline=True)
def show_hand_cursor(event):
t1.config(cursor='arrow')
def show_arrow_cursor(event):
t1.config(cursor='xterm')
def click(event):
webbrowser.open('www.zhihu.com')
#绑定事件
t1.tag_bind('tag3', '<Enter>', show_hand_cursor)
t1.tag_bind('tag3', '<Leave>', show_arrow_cursor)
t1.tag_bind('tag3', '<Button-1>', click)
mainloop()