对于熟悉使用C/C++来写程序的可以跳过,作为一个硬件工程师平时用python处理个数据,玩个爬虫容易上手,时间成本比较小,当然坑也是少不了。最近有个蓝牙功率计算的小程序需求,就当练练手。
python中的GUI框架还是很多的,PYQT,Tkinter,Wxpyhton等等,其中Tkinter是原生的无需安装,就从他入手,很多人说python写出来的UI特别丑。这点毋庸置疑,粗糙度让人叹息。但是我们的目标是实用主义,花最少的时间办最多的事情(立的flag瞬间就倒)。
1. python编程
直接参考Loan calculator using Tkinter这个例子修改一下标签,插入图片,并修改计算公式就搞定了(其实后续有更多坑)。
![fef6be066e5cb154bfd576704e8056d7.png](https://img-blog.csdnimg.cn/img_convert/fef6be066e5cb154bfd576704e8056d7.png)
def __init__(self):
# Create a window
window = Tk()
window.title("Loan Calculator") # Set title
# create the input boxes.
Label(window, text = "Annual Interest Rate").grid(row = 1,
column = 1, sticky = W)
Label(window, text = "Number of Years").grid(row = 2,
column = 1, sticky = W)
Label(window, text = "Loan Amount").grid(row = 3,
column = 1, sticky = W)
Label(window, text = "Monthly Payment").grid(row = 4,
column = 1, sticky = W)
Label(window, text = "Total Payment").grid(row = 5,
column = 1, sticky = W)
# for taking inputs
self.annualInterestRateVar = StringVar()
Entry(window, textvariable = self.annualInterestRateVar,
justify = RIGHT).grid(row = 1, column = 2)
self.numberOfYearsVar = StringVar()
Entry(window, textvariable = self.numberOfYearsVar,
justify = RIGHT).grid(row = 2, column = 2)
self.loanAmountVar = StringVar()
Entry(window, textvariable = self.loanAmountVar,
justify = RIGHT).grid(row = 3, column = 2)
self.monthlyPaymentVar = StringVar()
lblMonthlyPayment = Label(window, textvariable =
self.monthlyPaymentVar).grid(row = 4,
column = 2, sticky = E)
self.totalPaymentVar = StringVar()
lblTotalPayment = Label(window, textvariable =
self.totalPaymentVar).grid(row = 5,
column = 2, sticky = E)
# create the button
btComputePayment = Button(window, text = "Compute Payment",
command = self.computePayment).grid(
row = 6, column = 2, sticky = E)
# Create an event loop
window.mainloop()
2.打包python脚本为EXE程序
打包方法多种多样Pyinstaller,Py2exe,Nuitka等,但共同的问题都是打包后的体积大,单个程序启动运行慢,我试过两个办法分别在下面介绍一下:
--Pyinstaller
最直接的在python目录下运行
C:UsersUser>pyinstaller -F -w **.py
默认打包成文件夹形式,如果想要一个单独的EXE直接加-F,-w去掉windows控制台,也就是黑框。另外如果不替换图标,就会默认用pyinstaller的羽毛图标,一般都会要换成自己的项目图标-i **.ico。
C:UsersUser>pyinstaller -F -w -i **.ico **.py
另外大家最容易遇到的问题就是图片问题,如果程序内有图片,即使打包成一个文件也是有图片路径依赖的。隆重请出base64救场。先将图片转成由binary 转成 文本保存,例如下面例子中的img_str.
import os, base64
img_str = ‘9j/4AAQSkZJRgABAQAAAQAB****’
img_data = base64.b64decode(img_str)
with open('bt.jpg', 'wb') as f:
f.write(img_data)
#接下来就可以直接使用jpg文件了
#最后为了不再目录中保存图片直接remove掉
os.remove("bt.jpg")
总结,我这个简单的计算器打包大小10MB。。人家用c写的是70多K,有人说可以用UPX压缩,但是我压缩后大小9MB(黑人问号),而且报错打不开,只能默默加上--noupx,启动时更气人,需要7秒钟,别人秒开。泪目辽。。
--Nutitka
它本质是把python代码转换成python调用C API的形式,然后用C编译器进行编译,理论上运行快很多。windows上安装需要MinGW-w64,下载非常缓慢。等一切就绪,我们就开始打包,完事一看原来还是一个文件夹,里面各种依赖文件,启动是真快了,但是跟我的目标不一致,太鸡肋放弃。更别提安装编译过程中的各种waring和error。
#Usage: nuitka [--module] [--execute] [options] main_module.py
C:UsersUser>nutika --standalone --remove-output --windows-disable-console --windows-icon=ICON_PATH **.py