tkinter-text详解(2)

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()

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值