Python——pyqt5的计算器(源码+打包)

Python项目打包成exe教程:减小程序体积的方法
部署运行你感兴趣的模型镜像

目录

一、效果图

二、源码

三、如何打包

四、如何减小打包程序大小(方法1)

五、如何减小打包程序大小(方法2)

学习视频


一、效果图

只是单纯的练手,然后再学习一下如何打包

 

二、源码

calculator_UI.zip - 蓝奏云

三、如何打包

安装PyInstaller

pip install pyinstaller

快速打包命令:

pyinstaller -wF -i logo.ico main.py

main.py:是我要打包的python项目文件

 -i:为main.exe文件指定的图标(如果没有,则不需要该参数)

logo.ico :生成.exe文件的图标(推荐一个在线转换ico图标的网址

-F:生成结果是一个exe文件,所有的第三方依赖、资源和代码均被打包进该exe内

-w :不显示命令行窗口(如不用此参数,打包后的程序在运行时会弹出一个命令行窗口)


打包成功

 

  1. 基本用法 :  pyinstaller [选项] 文件名.py

  2. 常用选项

  3. -F, --onefile:将应用程序打包为单个可执行文件

  4. -D, --onedir:将应用程序打包为目录

  5. -c, --console:使用控制台模式(在终端窗口中运行应用程序)

  6. -w, --noconsole:使用Windows模式(没有控制台窗口)

  7. --name:指定应用程序的名称

  8. --distpath:指定输出目录

  9. --clean:在打包之前清除临时文件夹日志

  10. -d, --debug:生成运行时调试器

  11. --log-level:设置日志级别,供调试嵌入其他文件

  12. --add-data:将data文件夹嵌入到生成的可执行文件中

  13. --add-binary:将binary文件与其他文件一起嵌入到可执行文件中

  14. --hidden-import:打包特定的Python库,例如--hidden-import=PIL

  15. --version:显示版本信息

  16. --help:显示帮助信息

以上是_pyinstaller的常用选项和命令,可以根据需要进行选择和使用。

有时候,打包exe程序后的文件大小会非常大!如何减小呢?

四、如何减小打包程序大小(方法1)

1、安装pipenv

pip install pipenv

2、新建一个文件夹

安装完成后,随便找一个盘符,在这个盘符的根目录(最好是根目录)新建一个文件夹,作为虚拟环境,然后双击进入该文件夹

3、安装python版本(在虚拟环境下安装所需的python版本)

pipenv install -python 3.6
  • 系统有可能提示无法转换为 “utf-8”,具体原因是因为中文转码的问题,但是不必深究。
  • 这时候最好的方法是重启电脑
  • 重启电脑后,不要打开任何其他程序,重复上述第2步

4、激活虚拟环境(在命令行下)

pipenv shell
  • 如何系统提示无法转换为“utf-8”,则再次重启电脑
  • 然后重新进入power shell,再尝试运行 pipenv shell

5、安装需要的库(仅需安装需要打包的.py文件中所用到的库)

根据要打包的程序中需要导入的库,在pipenv环境下重新安装,例如:

pipenv install pyinstaller
pipenv install removebg

6、进行打包

把py脚本文件复制到这个新建的目录下,重新运行 pyinstaller

pyinstaller -wF -i logo.ico main.py

 五、如何减小打包程序大小(方法2)

使用 PyInstaller 将 PyQt5 程序打包成 exe 文件,并用 UPX 压缩生成的文件,即可生成尽可能小的 exe 文件。

1、安装 PyInstaller 和 UPX

打开命令行窗口(Windows 下可以按下 Win+R 后,输入 cmd 启动),输入以下命令安装 PyInstaller 和 UPX:

pip install pyinstaller pip install upx

2、创建 PyInstaller 打包配置文件

在 PyInstaller 命令行中输入以下命令,创建一个打包配置文件 myapp.spec

pyinstaller -y -w myapp.py

-y 表示自动覆盖现有的 build 和 dist 文件夹

-w 表示去除控制台窗口

此时当前目录会出现一个 build 文件夹和一个 dist 文件夹,dist 文件夹中会生成一个不压缩的 exe 文件。

3、修改 PyInstaller 打包配置文件

在当前目录下,使用编辑器打开 myapp.spec 文件,添加以下代码:

import upx
upx_path = "your_upx_path" # UPX 所在路径

a = Analysis(['myapp.py'],
             pathex=['your_path_for_py_file'], # myapp.py 所在路径
             binaries=[],
             datas=[],
             hiddenimports=['sip', 'PyQt5.QtCore', 'PyQt5.QtGui', 'PyQt5.QtWidgets'],
             hookspath=['hooks'],
             runtime_tmpdir=None,
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=None,
             alg='AES256',
             key=None,
             upx=True, # 是否开启压缩
             upx_path=upx_path, # UPX 所在路径
             console=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=None,
             alg='AES256',
             key=None,
             unbuffered=False)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='myapp',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True, # 经过测试,tostring() 或 tobytes() 方法生成的资源文件即是这里的 a.zipped_data
          upx_path=upx_path, # UPX 所在路径
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False,
          icon=None)

注意:

upx_path 需要填写 UPX.exe 所在的文件夹路径

hiddenimports 需要添加 PyQt5 相关的模块

4、打包 exe 文件

在命令行中输入以下命令,将 myapp.spec 文件转换为 exe 文件:

pyinstaller -y -c myapp.spec

生成的文件在 dist 文件夹内,文件名是在 myapp.spec 文件中 name 参数指定的。

-c 表示使用控制台程序,如果不需要控制台程序,可以将 -c 改为 -w

5、使用 UPX 压缩 exe 文件

在命令行中输入以下命令,使用 UPX 压缩 exe 文件:

upx --best myapp.exe

myapp.exe 是需要压缩的文件名

--best 表示使用最高级别的压缩


附代码

import sys

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QMainWindow, QApplication

from calculator import Ui_calculator_MainWindow



class MyMainForm(QMainWindow, Ui_calculator_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.start_x = None
        self.start_y = None
        self.anim=None
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        self.setWindowFlags(Qt.FramelessWindowHint)  # 设置窗口标志:隐藏窗口边框


        # Bind button scale up and scale down
        self.btn_max.clicked.connect(self.btn_max_click)
        self.btn_min.clicked.connect(self.minimize)
        self.btn_stop.clicked.connect(self.closeEvent)

        # 输入
        self.input = ''

        # 绑定方法
        self.bin_number()

    # 输入显示
    def add_input(self,input):
        self.input +=input
        self.number_input.setPlainText(str(self.input))

    # 计算结果
    def calculate_res(self):
        try:
            self.number_output.display(eval(self.input))
        except Exception:
            self.number_input.setPlainText('输入格式错误!')
            self.input = ''
        finally:
            # self.input = ''
            pass

    # clear LCD number
    def clear_input(self):
        self.input = ''
        self.number_input.setPlainText('')

    # back one number
    def back_number(self):
        self.input = self.input[:-1]
        self.number_input.setPlainText(self.input)

    # add button events
    def bin_number(self):
        # number events
        self.b_one.clicked.connect(lambda: self.add_input('1'))
        self.b_tow.clicked.connect(lambda: self.add_input('2'))
        self.b_three.clicked.connect(lambda: self.add_input('3'))
        self.b_four.clicked.connect(lambda: self.add_input('4'))
        self.b_five.clicked.connect(lambda: self.add_input('5'))
        self.b_six.clicked.connect(lambda: self.add_input('6'))
        self.b_seven.clicked.connect(lambda: self.add_input('7'))
        self.b_eight.clicked.connect(lambda: self.add_input('8'))
        self.b_nine.clicked.connect(lambda: self.add_input('9'))

        self.b_point.clicked.connect(lambda: self.add_input('.'))

        self.b_add.clicked.connect(lambda: self.add_input('+'))
        self.b_divide.clicked.connect(lambda: self.add_input('/'))
        self.b_multiple.clicked.connect(lambda: self.add_input('*'))
        self.a_substract.clicked.connect(lambda: self.add_input('-'))

        # calculate result
        self.b_equal.clicked.connect(lambda: self.calculate_res())

        # back one number
        self.b_back.clicked.connect(lambda: self.back_number())
        # clear input
        self.b_clear.clicked.connect(lambda: self.clear_input())


    # Window scale up and scale down
    def btn_max_click(self):
        if self.isMaximized():
            self.showNormal()
            # self.btn_stop.setText('放大窗口')
        else:
            self.showMaximized()
            # self.btn_stop.setText('缩小窗口')

    # 重写 closeEvent 函数,关闭窗口并停止程序运行
    def closeEvent(self, event):
        sys.exit()

    # 最小化窗口
    def minimize(self):
        self.showMinimized()

    # 鼠标左键释放时被触发
    def mouseReleaseEvent(self, event):
        self.start_x = None
        self.start_y = None

    # 在鼠标左键按下时被触发
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            super(MyMainForm, self).mousePressEvent(event)
            self.start_x = event.x()
            self.start_y = event.y()

    # 在鼠标移动时被触发
    def mouseMoveEvent(self, event):
        try:
            super(MyMainForm, self).mouseMoveEvent(event)
            dis_x = event.x() - self.start_x
            dis_y = event.y() - self.start_y
            self.move(self.x() + dis_x, self.y() + dis_y)
        except:
            pass

    # 窗口设置阴影效果
    def effect_shadow_style(self, widget):
        effect_shadow = QtWidgets.QGraphicsDropShadowEffect(self)
        effect_shadow.setOffset(12, 12)  # 偏移
        effect_shadow.setBlurRadius(128)  # 阴影半径
        effect_shadow.setColor(QColor(155, 230, 237, 150))  # 阴影颜色
        widget.setGraphicsEffect(effect_shadow)



    # 背景渐变
    # def paintEvent(self, event):
    #     painter = QPainter(self)
    #     gradient = QLinearGradient(0, 0, self.width(), self.height())
    #     gradient.setColorAt(0, QColor(89, 217, 212, 128))
    #     gradient.setColorAt(1, QColor(104, 202, 237, 128))
    #     gradient.setStart(0, 0)
    #     gradient.setFinalStop(self.width(), self.height())
    #     painter.setBrush(gradient)
    #     painter.drawRect(self.rect())




if __name__ == "__main__":


    app = QApplication(sys.argv)
    myWin = MyMainForm()
    myWin.show()


    # myWin.btn_img.clicked.connect(click())


    sys.exit(app.exec_())

学习视频

【已完结】PySide6百炼成真,带你系统性入门Qt_哔哩哔哩_bilibili【已完结】PySide6百炼成真,带你系统性入门Qt共计75条视频,包括:000 新的课程介绍、002环境搭建、003基础框架等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV1c84y1N7iL计算器这个案例就是跟着这个视频里做的!打call!很赞的教程!

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

【资源说明】 基于Pyqt5+Mysql开发的餐饮管理系统+数据库sql+项目说明(毕设源码).zip 开发功能如下: 一级功能 二级子功能 功能详述 员工管理 新增员工 添加新员工,填写员工基本信息。 修改员工 修改员工信息,包括姓名、联系方式、籍贯、等 删除员工 删除员工信息 查询员工 按照员工编号、姓名、性别等条件查询员工信息 员工登录 员工通过输入用户名和密码登录系统 菜品管理 新增菜品 添加新菜品,填写菜品基本信息、价格、数量、辣度等 修改菜品 修改菜品信息,包括名称、价格、辣度、数量、是否推荐等 删除菜品 删除菜品信息,同时删除与该菜品相关的订单信息 查询菜品列表 按照菜品编号、名称、价格等条件查询菜品信息 查看菜品详情 查看菜品详细信息,包括菜品名称、价格等 查询菜品销量 统计菜品销量信息。 点餐功能 点餐菜品 选择菜品以及数量进行下单 点餐付款 对下达订单进行付款 订单管理 删除订单 删除数据库中的订单 修改订单 修改数据库中的订单 新增订单 添加数据库中的订单 客户管理 新增客户 添加新客户,填写客户基本信息和联系方式 修改客户 修改客户信息,包括姓名、联系方式、身份证号、籍贯等 删除客户 删除客户信息。 查询客户列表 按照客户编号、姓名、性别等条件查询客户信息 客户登录 客户通过输入手机号和密码登录系统 库存管理 修改库存 修改库存信息,包括库存名称、数量等 删除库存 删除库存信息。 查询库存 按照库存编号、名称、等条件查询库存信息 新增库存 添加新库存,填写库存基本信息,包括库存名称、数量、存放位置等 报表生成功能 生成销售报表 生成统计销售额、销售量、菜品销售排名等信息的报表 生成收入报表 生成统计利润、成本等信息的报表 生成订单报表 生成统计订单数量等信息的报表 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peter123123123123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值