Python语言可以用在很多方面,网站开发、数据分析、运营维护、游戏开发等等,那么桌面应用程序GUI呢?其实Python标准库里自带Tkinter就是干这个的。相比PyQT、wxPython等等,Tkinter有哪些优势和不足,是否值得学呢?
要了解Tkinter,首先要从Tcl编程语言说起。Tcl语言全称是“Tool Command Language”,是John Ousterman在1980年代创建的一种解释型编程语言,当时John Ousterman正在加州大学Berkeley分校任职,需要一种相对简明的开发工程工具的编程语言,所以他就用C语言写了这个解释型语言,感觉故事是不是有点像Python!
接下来,他又用C结合Tcl写了个专门用于GUI编程的库,叫着Tk。当年这个Tcl/Tk在1980、1990年代可是非常的流行,尤其是在学术界、工程界和Unx程序员中。
而Tkinter又是什么呢?
我们知道Python最早是在1994年发行其1.1版本的,标准库里需要各方面的库,包括文本处理、图像处理等等,当然也不能少了GUI。Guido van Rossum(Python语言创始人)觉得Tk这个库现成的,而且还挺好用,就不再另造轮子了。他用C语言写了个在Python中可以调用Tk的接口,再把Tcl/Tk一起打包在标准库里,这样Python就可以实现GUI的开发功能。而Python中的这个接口,就是Tkinter。
你是不是会说“怎么能这样!”, 其实呢,这个也很正常啊,好东西,要大家一起分享嘛!不仅Python里是这么直接调用Tk库,Perl、Haskell里面的GUI库也是这个Tcl/Tk。
了解了上面这段Tcl、Tk和Tkinter的历史,我们再来谈谈这些是否值得学习。
其实,任何技术的选择与否,都是看这种技术的特点是否适合你的需求场景。对于Tkinter来说,它的特点大致是这么几个:
1. Python标准库里缺省自带
这个Tkinter可以说,就相当于Python事实上的标准GUI库。有啥好处呢?有Python的地方就有Tkinter,不用另外找第三方库单独安装,从而避免一堆兼容、版本等等的问题,这个对于初学者就比较友好。
2. Tkinter的API比较稳定
十几年前开发的工具,现在基本还能运行。Tcl/Tk从1990年代中后期,更新就非常慢了(基本就没变化),Tcl/Tk8.5版本一直用,直到2012年才憋出个8.6版本。更新慢也有好处,写的程序不会过几年就不好用了。
3. Tkinter就是个单纯的GUI库
Tkinter就是个单纯的GUI库,没有其他东西,真正要实现什么功能,都是依赖Python其他的库。不像PyQT、wxPython这些大而全的框架,什么都要自己弄一套。
4. 简洁
这个特点可以是优点:适合入门、小型应用的开发,但是也导致Tkinter的两大问题,一个是界面相对简陋,虽然现在Tk8.6有所进步,但是比起其他框架还是有不少差距;另一个是提供的控件都是比较基础的,稍微复杂一些的,比如HTML显示组件就要另外想办法。
这么看,Tkinter适合什么场合下学习和使用呢?
如果你是初入门的Python程序员,对Python的基本语法已经有所了解,想做点小应用实践实践,那么推荐你可以学习Tkinter。
因为如果一直开发命令行应用,很多时候不直观,成就感比较低,不能促进进一步学习的兴趣。
而如果这个时候,直接上手开发Web应用,还需要了解一堆html、css、js等前端的东西,比较麻烦,而且就算开发出来也就本机跑跑,真要部署到网络上还有域名、服务器一系列的问题。
而学了Tkinter后,马上可以做一点小应用,比如本地文件管理小工具、看图片的应用、解压小应用……这些小应用的开发,实际上主要是对Python处理这些问题方法和库的了解,Tkinter只是封装一个UI。也就是说你其实是在进一步学习Python。当然,你也可以不断优化这些小工具,当成自己的定制化工具,甚至可以分享给朋友用用,乐趣无穷。
5. 对于有一定基础的Python程序员,什么时候适合学下Tkinter呢?
需要写一些小工具的时候,本身是Python程序员,难免工作中需要一些桌面工具,解决些小问题,学习Tkinter绝对是投入少、产出高的选择。比如笔者以前同事做测试,一些配置工作很麻烦,且很易出错,这个时候用tkinter写个配置小工具,就方便很多。
另一个是可以用Tkinter写一些应用原型。很多时候,一个应用的需求还不是很明确,可以用Tkinter先快速写一个,拿出来大家讨论,进一步明确需求。等真正需求明确了,再根据需求选择技术方案。
Tkinter的特点,比较适合初学者学习Python、Python程序员开发一些小工具、Python程序员做原型应用。
而如果你的目标是开发商用的桌面应用程序的话,那Tkinter可能不适用,建议还是使用PyQT或者直接使用其他语言。
如有疑问,欢迎在评论区一起讨论!
如有不正确的地方,欢迎指导!