tkinter文本框小功能(6):锚点
- 引言
- 添加标识
- 添加锚点
- python层面
- Tin层面
- 结语
引言
锚点之一概念在文本浏览中很常见,那就是在同一页面的文本内容在,添加一个锚点标识符,指向一个确定的标识(mark),而且这个标识在文本渲染后真是存在。当读者点击标识时,会自动显示到相关的内容部分。因此,这个功能虽小,但是确实很实用。特别是单页文本比较长时,使用目录和锚点搭配,可以达到很好的效果。
因此,与其说锚点是文本框的一种功能,它更像是一种阅读体验。
添加标识
在tkinter.Text中,我们可以使用mark_set
方法来添加标记。
好处在于这是一个现成的标记方法,而且可以指定位置。
self.mark_set(mark_name,index)
而在Tin标记语言中,使用<mark>
标签进行类似操作。不过更加方便的是,<mark>
标签不需要指定标记位置,因为TinEngine会自动锁定当前渲染输出位置。也就是说,当你需要在某一个部分的内容添加标记时,不需要理会上下文是什么,也不需要知道渲染到这里到底是什么index位置,只需要在这里添加一个<mark>
标记即可。
这样的设计可以让编写者更清楚自己在写什么而不是要一直使用mark_set
来进行反复测试。
<title>标记测试
<main>随便什么内容
<sp>5
<main>下面一行的开头有一个标记
<mark>tag1
<sp>3
<middle>本文末尾有一个tag2
<mark>tag2
<sp>
;下面省略
添加锚点
python层面
这个在tkinter中就没有现成的功能了。
在TinEngine中,使用了如下类似代码来处理标签:
if tag_num>3:
self.error(str(tag_count),'<acr>最多支持三个参数:<acr>mark;fg;bg')
out()
if u[0]=='':
out()
if tag_num==1:
state=self.arc_(u[0])
else:
state=self.arc_(*u)
if not state[0]:#不正常
out()
大家不需要理会这些代码的具体含义,因为这个不是重点。
在python层面,主要是写响应功能。剩下的两个颜色参数都是由编写者自行决定的。接下来才是主要功能代码。
def arc_(self,mark,f='',b=''):
acr_tag='acr_'+f+b
try:
self.tag_config(acr_tag,foreground=f,background=b)
except:
return False,f'颜色错误:{f}或{b}不符合颜色编码'
self.insert(self.end,'⚓',acr_tag)
self.tag_bind(acr_tag,'<Enter>',lambda e:self.config(cursor='hand2'))
self.tag_bind(acr_tag,'<Leave>',lambda e:self.config(cursor='xterm'))
self.tag_bind(acr_tag,'<Button-1>',lambda e:self.see(mark))
return True,''
以上也是省略代码,但主要看逻辑。
f、b分别且前景色、背景色。
很简单,那就是添加一个“⚓”,然后绑定一些事件。
值得注意的是,我们不能够先行确定标记。因为这个标记不一定存在于当前已经渲染完成的内容。当然,如果使用python编写的话,先不先获取标记,无伤大雅。但是在标记语言中就不同了。
Tin层面
Tin中,使用<acr>
标签添加锚点。这个锚点可以在任意位置。因为hi要在点击时,才会去锁定对应标记。
根据之前的一段标记文本段,继续完善:
<title>标记测试
<main>随便什么内容
<sp>3
<middle>右边是一个锚点👉
<acr>tag2
<sp>5
<main>下面一行的开头有一个标记
<mark>tag1
<sp>3
<middle>本文末尾有一个tag2
<mark>tag2
<sp>3
<middle>本文末尾有一个tag3
<mark>tag3
<sp>
;下面省略
效果如下:
结语
tkinter文本框的功能拓展远不只此,更多新奇的方法也在不断被开发。