Python——pyqt5的计算器(源码+打包)
目录
一、效果图
二、源码
三、如何打包
四、如何减小打包程序大小(方法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 :不显示命令行窗口(如不用此参数,打包后的程序在运行时会弹出一个命令行窗口)
打包成功
基本用法 : pyinstaller [选项] 文件名.py
常用选项
-F, --onefile:将应用程序打包为单个可执行文件
-D, --onedir:将应用程序打包为目录
-c, --console:使用控制台模式(在终端窗口中运行应用程序)
-w, --noconsole:使用Windows模式(没有控制台窗口)
--name:指定应用程序的名称
--distpath:指定输出目录
--clean:在打包之前清除临时文件夹日志
-d, --debug:生成运行时调试器
--log-level:设置日志级别,供调试嵌入其他文件
--add-data:将data文件夹嵌入到生成的可执行文件中
--add-binary:将binary文件与其他文件一起嵌入到可执行文件中
--hidden-import:打包特定的Python库,例如--hidden-import=PIL
--version:显示版本信息
--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!很赞的教程!
Python——pyqt5的计算器(源码+打包)相关推荐
- 照片背景底色更换工具二(python+flask网页版源码及打包)
照片背景底色更换工具二(python+flask网页版源码及打包) 所有源码 文件结构 static images huaman_src_test.jpg huaman_result_test.png ...
- 2016年最经典的高仿系列源码打包下载4.84G
│ JAVAapk.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2015.11.04更新.txt ...
- 图片坐标提取软件/图片坐标点和像素点颜色提取软件/图片坐标获取工具/Python图片坐标获取源码/图片像素坐标获取软件/python tkinter 图片显示(完全开源)
该软件使用python写的,可以提取像素点的坐标还有也能获取像素点的16进制数据RGB565和RGB888(RGB888仅最新的源码才支持),可以单点坐标也可以按键坐标,甚至可以使用简单的左右键配合使 ...
- python浪漫代码-python七夕浪漫表白源码
本文实例为大家分享了python七夕浪漫表白的具体代码,供大家参考,具体内容如下 from turtle import * from time import sleep def go_to(x, y) ...
- 萝卜源码前后端源码+打包APP的教程
简介: 今天分享一个萝卜源码前后端源码+打包APP的教程 我相信很多人都有源码但是不会配置复杂的AS工具导致一直没有打包好属于自己的APP 所以,今天我来了 萝卜前端APPJava源码 先把源码发出 ...
- O2OA二次开发(一)前后端源码打包部署命令
O2OA二次开发(一)前后端源码打包部署命令 o2oa源代码全部build一次要花费很长时间,有时候我们只是修改了前端代码或者只是修改了后端代码,没必要进行全部重新编译打包. 全部打包命令 执行以下命 ...
- Python个人网盘源码、云盘系统源程序,基于Django+Mysql
Python个人网盘源码.云盘系统源程序,基于Django+Mysql 1.安装依赖 pip install -r requirements.txt 2.检查配置文件,修改邮箱和数据库配置 # myc ...
- Matlab GUI/APP 浅谈(附计算器源码)
Matlab GUI/APP 浅谈(附计算器源码) 今天没有什么段子,也没有心灵鸡汤.毒鸡汤啥的,纯粹聊一聊这些年从有关MATLAB GUI/APP开发中悟出的一点道理,顺便把计算器的源代码给大家. ...
- python爬虫教程:Scrapy框架爬取Boss直聘网Python职位信息的源码
今天小编就为大家分享一篇关于Scrapy框架爬取Boss直聘网Python职位信息的源码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 分析 使用Crawl ...
- Python与Seo工具源码,全网搜录查询助手exe
Python与Seo工具源码,全网搜录查询助手exe 很多人都说,seo是一个玄学,诚然,一方面是排名,另一方面是收录,尤其是对于渣渣而言,当然收录和排名都需要去验证,去查询,乃至去监控,大批量的话, ...
最新文章
- 运维基础(14)Mysql5.7 里4个数据库
- excel函数去重_将数字去重,然后按从小到大的顺序连接起来!
- 电气期刊论文实现:考虑爬坡约束和输电损耗的经济调度【有代码】
- 出产报表数据库呈现了运动事项的回滚段毁坏(二)
- 驱动_Input输入子系统
- 数据库优化:52 条 SQL 语句性能优化策略,果断收藏!
- 【渝粤教育】电大中专计算机常用工具软件 (2)作业 题库
- vue——去除白色边框
- javascript如何处理很多数据,类似分页切换
- hadoop2.9.2安装hadoop_pid_dir_Hadoop3.2 +Spark3.0全分布式安装
- @scheduled注解配置时间_《SpringBoot整合redis、Scheduled/quartz定时任务》
- 科来网络分析系统 6.7 技术交流版序列号
- 支付行业架构流程梳理
- 计算机nemurt.dll,DDD~领域事件中使用分布式事务
- 计算机中文核心期刊哪个快,计算机中文核心期刊要多久cpci加急,又快又水的sci期刊...
- ESP32下载固件教程
- spring-retry简单用法
- 我们跟30家PoS团队聊了聊,Staking最硬核的干货都在这儿了
- 【元器件学习笔记—电阻】(4)——电阻器基本工作原理和主要特性
- 扫描仪(Scanner)用法
热门文章
- Verilog乘法的实现——Xilinx Multiplier IP研究(1)
- 用Unity做一个小Demo入门Unity
- Java实现 LeetCode 521 最长特殊序列 Ⅰ(出题人:“就是喜欢看你们不敢相信那么简单,又不敢提交的样子。”)
- Nginx动静分离配置
- 显示12306服务器处理中正在排队,12306排队等待中怎么回事_12306排队等待时间_12306一直在排队解决方法...
- 北京市自动驾驶车辆测试概况
- spring boot(四):thymeleaf使用详解
- 水星MW300R V6(MT7620)CPU引脚图
- ios textfield 拼音输入 完成才录入
- oracle的驱动是什么文件,oracle数据库驱动在哪个文件夹