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

news/2024/10/21 3:18:51/

目录

一、效果图

二、源码

三、如何打包

四、如何减小打包程序大小(方法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_dataupx_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 sysfrom PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QMainWindow, QApplicationfrom calculator import Ui_calculator_MainWindowclass MyMainForm(QMainWindow, Ui_calculator_MainWindow):def __init__(self, parent=None):super().__init__(parent)self.setupUi(self)self.start_x = Noneself.start_y = Noneself.anim=Noneself.setAttribute(QtCore.Qt.WA_TranslucentBackground)self.setWindowFlags(Qt.FramelessWindowHint)  # 设置窗口标志:隐藏窗口边框# Bind button scale up and scale downself.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 +=inputself.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 numberdef clear_input(self):self.input = ''self.number_input.setPlainText('')# back one numberdef back_number(self):self.input = self.input[:-1]self.number_input.setPlainText(self.input)# add button eventsdef bin_number(self):# number eventsself.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 resultself.b_equal.clicked.connect(lambda: self.calculate_res())# back one numberself.b_back.clicked.connect(lambda: self.back_number())# clear inputself.b_clear.clicked.connect(lambda: self.clear_input())# Window scale up and scale downdef 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 = Noneself.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_xdis_y = event.y() - self.start_yself.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!很赞的教程!


http://www.ppmy.cn/news/66120.html

相关文章

7.外观模式C++用法示例

外观模式 一.外观模式1.原理2.特点3.外观模式与装饰器模式的异同4.应用场景C程序示例 一.外观模式 外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,隐藏了一个或多个复杂的子系统的复杂性,并使…

宏任务、微任务在时间循环中的执行

如何描述事件循环,及里面宏任务、微任务的执行过程 事件循环相关描述事件循环流程图案例案例代码案例解析 事件循环相关描述 为什么有事件循环 解决js单线程工作,会堵塞程序的问题 单线程任务类型 同步任务:在主线程上排队,直接执…

南京邮电大学数据库实验一(SQL语言)

文章目录 一、 实验目的和要求二、实验环境(实验设备)三、实验原理及内容1、了解并掌握SQL*Plus环境的使用2、用SQL的DDL语句图书管理系统创建基表3、为基表“读者”补充定义:职称只能取初级、中级、高级之一。4、用SQL的DML语句向上述基表中增加、修改和删除数据5、…

MySQL数据库——MySQL修改存储过程(ALTER PROCEDURE)

在实际开发过程中,业务需求修改的情况时有发生,所以修改 MySQL 中的存储过程是不可避免的。 MySQL 中通过 ALTER PROCEDURE 语句来修改存储过程。下面将详细讲解修改存储过程的方法。 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE…

InnoDB线程模型

新版本结构演变 MySQL 5.7 版本 将 Undo日志表空间从共享表空间 ibdata 文件中分离出来,可以在安装 MySQL 时由用户自行指定文件大小和数量增加了 temporary 临时表空间,里面存储着临时表或临时查询结果集的数据Buffer Pool 大小可以动态修改&#xff0…

【最新可用】chatGPT镜像网站国内使用,免费稳定!

新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT 2023.5.8新增一个 ChatGPT 国内免翻版 【网站名称】:Chat GPT Ai 【使用环境】:移动端/电脑网页端 ChatGPT是一款功能强大的免费在线聊天机器人,具有人工智能…

Java分布式事务(十八)

文章目录 🔥最终一致性分布式事务解决方案_什么是最大努力通知型分布式事务🔥最大努力通知型分布式事务_最大努力通知与可靠消息最终一致性的区别🔥最大努力通知型分布式事务解决方案🔥最大努力通知型分布式事务_案例业务说明🔥最大努力通知型分布式事务实战_实现充值…

docker学习笔记(二)

目录 启动Docker ​编辑 建立 Docker 用户 ​编辑 测试 Docker 是否正常工作 卸载Docker Docker镜像加速器配置 配置镜像 检查加速器是否生效 如何在Linux中的.json文件下保存并退出 如果我是使用vi操作进来的,我该如何保存并退出呢? 如何在Li…