为什么用pyinstaller打包后打不开_Tkinter+Pyinstaller 快速打造半吊子Windows小程序

对于熟悉使用C/C++来写程序的可以跳过,作为一个硬件工程师平时用python处理个数据,玩个爬虫容易上手,时间成本比较小,当然坑也是少不了。最近有个蓝牙功率计算的小程序需求,就当练练手。

python中的GUI框架还是很多的,PYQT,Tkinter,Wxpyhton等等,其中Tkinter是原生的无需安装,就从他入手,很多人说python写出来的UI特别丑。这点毋庸置疑,粗糙度让人叹息。但是我们的目标是实用主义,花最少的时间办最多的事情(立的flag瞬间就倒)。

1. python编程

直接参考Loan calculator using Tkinter这个例子修改一下标签,插入图片,并修改计算公式就搞定了(其实后续有更多坑)。

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值