tkinter富文本tkr(1)简介
引言
tkinter是Python官方使用的GUI库,这大家都知道。关于tkinter的优点和缺点,在这里不多说,本专栏主要讨论和研究tkinter原生的富文本格式,以此来为tkinter创建一个适用于tkinter本身的富文本格式文件,并实现渲染。
tkinter能够使用的富文本
Text本身
Text组件是tkinter当中功能丰富性仅次于Canvas的组件,同时也是内容排版最方便的组件。Text通过tag、mark等方法操作,可以展示一定的富文本内容,在tkinter界面开发中有很重要的作用。但是,缺点也很明显。
- 内容渲染也功能代码较差,不利于规范开发
- 方法使用与Python中的函数使用无二,如果要显示的内容复杂,怎么代码相应的也是很复杂的
比如显示有颜色的文字:
Text.tag_config('colorred',foreground='red',background='black')
Text.insert('end','red words','colorred')
仅显示几个红色的文字就需要这么多的代码,更多、更复杂的显示所需要的代码量可想而知。
HTML
tkinter显示HTML?好吧,告诉你,这是完全可以的。
显示HTML3
通过tkhtmlview
包即可。该包通过使用Text实现对HTML3的渲染。
pip install tkhtmlview
缺点如下:
- HTML3的渲染效果不佳,因为选择用富文本组件去实现超文本
- 灵活性还不如直接使用代码
显示HTML4
通过tkinterweb
包即可。该包通过自定义一个TkHtml组件,实现对HTML4的渲染。
pip install tkinterweb
这个看起来渲染效果很好,但是也有它的不足:
- 网页下载慢,因为受Python模块速度的限制
- HTML4的css样式显得毛糙
- 需要绑定大量回调函数,否则无法达到渲染HTML4的效果
显示HTML5
在tkinter中显示HTML5,就需要外部支持了。
第三方包:
pip install tkinterie //调用系统ieframe
pip install mbpython //使用miniblink.dll,需要额外下载
pip install cefpython //使用谷歌内核
其它方法:
其中,tkinterie依赖于系统;mbpython无法播放视频;cefpython体积庞大;嵌入窗口无法对组件进行有效控制。
富文本标记语言
在tkinter中,通过操作富文本标记语言,实现富文本渲染。
Markdown
通过markdown2
包将Markdown转化为HTML,再用上面提过的方法渲染HTML。目前还没有直接渲染Markdown的组件或应用。
Tin
Tin标记语言是我定义和创造出来的。Tin标记语言使用TinText进行渲染,既可用于富文本展示,也可以作为“Tinlayout”进行页面布局。
pip install tinengine
主角TKR(tkinter rich form)
tkr是依据tkinter.Text本身定义出来的富文本格式,但这并不是tkinter原生的,而是我通过对Text的样式描述提出来的。
格式
tkr的版本为:1,目前,tkr只能够描述文本内容,且粗体、斜体以及tag_bind等内容无法渲染,因为这涉及到tkinter中其它的库。
tkr文件的格式如下:
=tagon=
tagname1 {'background':'','bd':'0','cursor':'hand2',...}
tagname2 {...}
...
=tagoff=
=texton=
[('tagon','tagname1','1.0'),('text','words use tagname1','1.0'),('tagoff','tagname1','1.17'),...]
=textoff=
通过格式描述,很明显的看出tkr文件中的内容,tag部分定义了不同的标签不同的样式,text部分描述了Text组件如何渲染内容。
如何生成&渲染
这个内容不是本文章要探讨的,这两个内容留到之后的文章中。
不过,我已经向好了该如何初步完成tkr文件的生成和渲染。
解析生成
使用Text的dump方法获取内容描述,通过tag_config方法获取样式描述。
渲染方法
先解析样式描述,再通过text部分的内容逐个渲染。
为什么用TKR
tkr格式是根据tkinter自身规定出来的格式,与tkinter的Text具有良好耦合性,有很多优点。
- 基于原生tkinter,一般不需要其它库的支持
- 以描述格式为主体,方便解析渲染
- 相比渲染HTML有更快的速度
- 相比Text本身代码操作更加简洁,因为tkr文件不需要手写,它的解析生成会在往后的文章中详细说明
当然,tkr也有缺点:
- 无法描述动态内容,与Tin相比缺少动态富文本功能和交互功能,只能达到Markdown层面
- 仅限于Text能够展示的内容,目前无法内嵌组件
- 样式缺乏
显然,上述的所有富文本渲染,在tkinter中都有优劣,但是tkr格式文件最大的有点,就是对tkinter而言,使用相当方便。
结语
关于TKR格式文件,就先引到这,专栏中的其它文章将会细致讲解TKR文件。