引言
作为基于tkinter的第一款原创标记富文本渲染组件,TinEngine可以用于很多方面:
- 富文本(Tin标记文本)渲染阅读
- 文本信息多样化
- 适用于tkinter的TinLayout窗体设计
其中,很多情况下,TinText(TinEngine的核心组件)都需要做到与常规窗口一样的功能,那就是能够安全地使用线程。
多线程,给程序带来了一定的速度提升,使程序能够同步处理多项事件。TinText必须能够不阻塞程序地进行富文本渲染。
问题来源
事实上,TinText在设计时没有考虑过使用多线程。在使用一些标签时,因为TinText自身的耗时,就会阻塞主程序,导致使用者的使用体验下降。这些标签包括:
<stop>:常规暂停标签,期间使用者或读者不能够进行任何操作
<html>
<middles>
……
<stop>标签是比较能够体现Tin标记语言特性的一个标签,但同时也会阻塞程序运行。
Tin的特性之一:使读者跟随编写者的思路阅读文本。
如果TinText能够在独立的线程中渲染,整个程序的使用流畅度都将提升。
问题的解决
在2021-4-4发布的TinEngine-2.2.9中,已经解决了这个问题,TinText可以安全地使用线程了。
需要注意的是,TinText本身不提供独立线程的渲染,多线程渲染需要自己编写线程代码实现。此次更新只是为了解决TinText能否使用多线程,而不是提供新的方法。
代码模板
因为进行了更新,可以直接将TinText的渲染代码放在多线程函数中。以下是代码片段:
#...
_tin='''<title>多线程测试
<main>下面将暂停10秒
<stop>10
<main>暂停结束……;center;red
;这里采用暂定十秒的标记,为了使对比更加明显
'''
def thread_paint():#多线程渲染
tin.point_file(_tin.split('\n'))
#2.3.1以上版本使用以下代码
#tin.point_file(_tin)
def common_paint():#普通渲染
tin.point_file(_tin.split('\n'))
#2.3.1以上版本使用以下代码
#tin.point_file(_tin)
tin=TinText(root,font=('楷体',12))
tin.pack(fill='both',expand=True)
th=threading.Thread(target=thread_paint)
th.start()
#command_paint()
#...
效果显而易见,在暂停选的同时,多线程代码依然能够操作窗口,而普通渲染则无法操控窗口。
结语
TinEngine必将越来越强大。(透:往后会加入代码标签,增强交互性~~)