我的主力编程语言现在是Python,平时也会使用Python写一些小脚本做文件处理(更简单一些的操作会直接用Shell命令)。基本不会接触到GUI界面的编写。但是呢,对于我而言命令行是可行的方案,但是如果要把代码交给没有编程基础的人,并且没有相关的开发环境时。就需要GUI和打包技术了。最近就遇到一个情况需要开发一个类似图片直方图均衡的功能给和课题组合作的医生使用,工作的电脑是离线的,医生没有编程基础。

要求条件:

使用Python,快捷开发;

GUI;

独立的EXE可执行文件。

技术栈:

Numpy,用于对像素数组进行映射;

Pillow,图像库,底层调用numpy;

TkinterDND2使用Python内置的Tkinter的改进版,支持基础的code based UI和文件拖拽功能。使用conda安装。

我的开发环境是OS X,幸好之前一个老师分配的Windows虚拟机还能用。Python环境3.7.3。

第一版

image.png

支持选取图片文件夹,递归查找其中的jpg文件并处理。

文件夹选取功能

image.png

图片处理函数

image.png

简单的对图片像素映射到0-255的范围。能够使得标本图片更容易标注。

恢复函数

image.png

相当于图片处理函数的逆操作,在图片处理的时候保存了每一张图片的处理参数。

性能分析:

image.png

因为一个标本采集的图片有接近2000张,测试时预估大约需要8分钟才能完成一个标本的图片优化。而费

使用cProfile进行性能分析,61张图片要18秒多。平均一秒3张图片。主要的时间消耗是在转换成numpy矩阵、保存图片和图片处理函数。基本是不能够再优化的。那么就要从数据量方面考虑,是否每一张图片都需要优化并标注?其实不是的,每一个标本只需要选取最多10张进行标注,那么由医生选取并且拖放到指定界面会更快捷。

第二版

image.png

第二版添加了拖放功能并且把文件夹选取的功能去掉了。可以拖放多个文件,并且会筛选处理其中的jpg文件。

PS: 连标题都懒得改。。

pyinstaller打包

使用pip 安装pyinstaller打包,pyinstaller是系统依赖的,在什么系统打包,在什么系统使用。坑很多。

总结

使用pyinstaller遇到几个bug。six,warm

打包太大了。有500MB。代码量180行。

加了Frame之后文件夹输入框就不更新了。可能的原因是pack和grid在frame和widge之间混用。或者混用Tkinter和TkinterDnD2。因为文件夹选取的方案被替换掉了。所以这个bug不再存在。

conda环境安装耗时较久。

还是java香。