引言
TinEngine基于tkinter开发,是适用于tkinter的富文本渲染框,富文本标记为Tin标记语言。通过在tkinter窗口中使用TinText组件,可以实现类似HTMLlayout的效果,从而进一步提升tkinter界面程序UI部分开发的效率。
在CSDN中,我创建了Tin标记语言专栏,包含用Python实现Tin,以及Tin使用技巧两种类型的文章。
但至少在这一篇文章之前,我并没有详细谈到为什么开发TinEngine,也没有讲明为什么用tkinter开发TinEngine。那么接下来,我将给出基于tkinter开发TinEngine的几点理由。
为何基于tkinter开发TinEngine
tkinter基于tcl/tk,本身使用的是系统标准组件,像显示HTML、视频、高级表格等,原生tcl/tk是无法做到的,而且很多人认为tkinter根本做不到。那么,为什么要基于这一个GUI库来开发TinEngine?
以下是几点非常重要的原因。
初学者对tkinter的三分钟热情
在学习Python的gui时,几乎所有初学者使用都tkinter,开发一些简单的界面程序或者是游戏。但是,等时间一长,很多初学者就会感到tkinter能够使用的组件,跟wx和qt比起来很少,而且功能也较少。这些人便纷纷使用像wxpython、pyqt一样的GUI库。然而,此时他们根本没有将GUI熟练掌握,也就是本身对tkinter一知半解,就往更复杂的东西探索。
这种思想无疑错误得十分严重。
我不是说wx和qt不好,而是因为就qt而言,一般的个人项目根本用不到,最多用到wxpython。况且连tkinter都掌握不了,怎么去掌握更加复杂的wxpython?
很多初学者直接或很快就学习wx和qt,仅仅是看到它们的功能和原生组件比tkinter丰富,但是忽略了几个问题:这么丰富的功能,用得到吗?wx和qt做出的项目,光是GUI就几十M,上百M也太正常不过,但是,有这么多的支持项,与自己开发的项目能用到的功能相比,值吗?
而且,tkinter不只用于初学者,既然tkinter存在,那么必定有它的重要意义。
现在我可以告诉大家,tkinter通过编写新功能,可以实现如下功能:
而且,实现这些功能的依赖,比wx和qt小得多了,并且需要什么添加什么依赖。当然,有些wx和qt原生就有的东西,比tkinter额外编写的东西,确实要好。但是,当能够用到对wx和qt自己都是高级的组件的时候,难道对tkinter还是一知半解吗?如果不是,那为什么在一些论坛上,时常能够看到一些人对关于wx或者是qt如何布局、组件的概念、组件参数、组件基础方法提出问题?这不都应该早就掌握吗?
不是tkinter不够好,是某些人不愿意钻研(我知道肯定有人说,哪有什么时间钻研,我想问哪有什么时间在没有地基的高楼上安装阻尼器)。开发TinEngine,就是为了证明,tkinter这个GUI的存在,有它自己的意义。
tkinter缺乏新的布局机制
tkinter目前(常见的)有三种布局机制(不是方式)。
第一种是常规布局,如:pack, grid, place。这是tkinter本身的。
第二种是以xml(和类似文件)为载体,对其进行解析,如:tk-builder(第三方库)
第三种是基于列表和pack/grid的声明式布局,如:ticklish-ui(第三方库)
这三种虽然用途广泛,但缺少像HTMLlayout那样以文字阅读为主体,附加功能的渲染式布局机制。
TinEngine,也因此而开发。(这几种布局机制各有优劣)
tkinter开发效率
即使tkinter拥有可视化编辑器——PAGE,但也只能够解决UI部分,缺少功能部分。包括上面提到的三种布局方式,都只能够解决UI部分的工作量大的问题。
TinEngine并没有将UI和功能结合,否则就回到的GUI的原点。但是,TinEngine在提供良好的UI渲染方案的同时,允许同步嵌入功能组件,从而触发功能代码。因为TinEngine的主要思想:让读者决定除了渲染之外的一切。此外,TinEngine基于tkinter中除了Canvas之外最强大的控件——Text,并以此开发Tin标记的核心——TinText。
Tin中,使用<code>载入Python、Tcl或VBS代码段。通过tins拓展添加使用代码段的功能交互组件。
使用TinEngine开发界面程序,UI部分就像是写文章,功能部分可以正常不过地无缝嵌入,使用标签还可以进一步简化功能代码的复杂程度。
除此之外,TinEngine基于自动分析标记文本套用各类渲染格式,而且使用gcc编译后的pyd文件发布,无论是UI编写速度还是渲染速度,一定比用纯tkinter快。
结语
说了这么多,到底也就是“tkinter的证明”和“tkinter的实践”,在实验和应用中不断地证明和实践,不断地提升tkinter开发能力。
上面的部分言辞(特别是对某些tkinter初学者)可能有些欠妥,只是为了明确我的立场,若措辞不足,还望大家原谅。