Python自带的GUI库Tkinter是否值得学习?

2020-05-29 by Vincent Ping

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。

Tkinter值得学吗?

了解了上面这段Tcl、Tk和Tkinter的历史,我们再来谈谈这些是否值得学习。

其实,任何技术的选择与否,都是看这种技术的特点是否适合你的需求场景。对于Tkinter来说,它的特点大致是这么几个:

  • Python标准库里缺省自带

这个Tkinter可以说,就相当于Python事实上的标准GUI库。有啥好处呢?有Python的地方就有Tkinter,不用另外找第三方库单独安装,从而避免一堆兼容、版本等等的问题,这个对于初学者就比较友好。

  • Tkinter的API比较稳定

十几年前开发的工具,现在基本还能运行。Tcl/Tk从1990年代中后期,更新就非常慢了(基本就没变化),Tcl/Tk8.5版本一直用,直到2012年才憋出个8.6版本。更新慢也有好处,写的程序不会过几年就不好用了。

  • Tkinter就是个单纯的GUI库

Tkinter就是个单纯的GUI库,没有其他东西,真正要实现什么功能,都是依赖Python其他的库。不像PyQT、wxPython这些大而全的框架,什么都要自己弄一套。

  • 简洁

这个特点可以是优点:适合入门、小型应用的开发,但是也导致Tkinter的两大问题,一个是界面相对简陋,虽然现在Tk8.6有所进步,但是比起其他框架还是有不少差距;另一个是提供的组件都是比较基础的,稍微复杂一些的,比如HTML显示组件就要另外想办法。

这么看,Tkinter适合什么场合下学习和使用呢?

  • 如果你是初入门的Python程序员,对Python的基本语法已经有所了解,想做点小应用实践实践,那么推荐你可以学习Tkinter。

因为如果一直开发命令行应用,很多时候不直观,成就感比较低,不能促进进一步学习的兴趣。

而如果这个时候,直接上手开发Web应用,还需要了解一堆html、css、js等前端的东西,比较麻烦,而且就算开发出来也就本机跑跑,真要部署到网络上还有域名、服务器一系列的问题。

而学了Tkinter后,马上可以做一点小应用,比如本地文件管理小工具、看图片的应用、解压小应用……这些小应用的开发,实际上主要是对Python处理这些问题方法和库的了解,Tkinter只是封装一个UI。也就是说你其实是在进一步学习Python。当然,你也可以不断优化这些小工具,当成自己的定制化工具,甚至可以分享给朋友用用,乐趣无穷。

  • 对于有一定基础的Python程序员,什么时候适合学下Tkinter呢?

需要写一些小工具的时候,本身是Python程序员,难免工作中需要一些桌面工具,解决些小问题,学习Tkinter绝对是投入少、产出高的选择。比如笔者以前同事做测试,一些配置工作很麻烦,且很易出错,这个时候用tkinter写个配置小工具,就方便很多。

另一个是可以用Tkinter写一些应用原型。很多时候,一个应用的需求还不是很明确,可以用Tkinter先快速写一个,拿出来大家讨论,进一步明确需求。等真正需求明确了,再根据需求选择技术方案。

总结下:

Tkinter的特点,比较适合初学者学习Python、Python程序员开发一些小工具、Python程序员做原型应用。

而如果你的目标是开发商用的桌面应用程序的话,那Tkinter可能不适用,建议还是使用PyQT或者直接使用其他语言如C++。