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

news2024/10/6 4:01: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_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!很赞的教程!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/503089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读《Centralized Feature Pyramid for Object Detection》

论文地址:https://arxiv.org/pdf/2210.02093.pdf 源码地址:https://github.com/QY1994-0919/CFPNet 概述 特征金字塔模块在众多计算机视觉任务中都有优异的性能表现。针对现有的方法过渡关注于层间的特征交互而忽略了层内的特征交互的问题,本…

药物分子虚拟筛选规则

药物分子虚拟筛选规则 Lipinski Rule RO5是辉瑞公司资深药物化学家Christopher A. Lipinski在1997年提出,虽然随时代发展虽然其适用范围逐渐变窄,但仍然非常有参考意义。其主要内容如下: 分子量(Mw)小于500;氢键供体(HBD)数目小…

matlab 对线路板进行裁剪

缺陷图像目前还没有搞定————(无奈) test1 %Sobel方法 I imread(ChuanJian0.jpg); G rgb2gray(I); E1 edge(G, sobel); figure, subplot(2,2,1); imshow(I); title(Original Color Image); subplot(2,2,2); imshow(E1); title(Sobel Edge);E2 ed…

使用PyTorch构建神经网络,并计算参数Params

文章目录 使用PyTorch构建神经网络,并计算参数Params举例计算具有全连接层的神经网络的参数数量计算卷积神经网络的参数数量Params计算过程 总结 使用PyTorch构建神经网络,并计算参数Params 在深度学习中,模型的参数数量是一个非常重要的指标…

零基础学Java好找工作吗?好程序员告诉你入行Java有多惨?

为什么小源建议普通背景、零基础的大专生、本科生去学java编程呢? 因为真的香啊!小白容易上岸,而且工作3年的话,基本年薪就能到50w(只要你工作后也一直不断努力学习)。java岗位属于技术岗,没有任…

Android进阶:Activity的生命周期和启动模式

Activity的生命周期和启动模式 作为Android四大组件之中存在感最强的组件,Activity应该是我们在学习Android中第一个碰到的新概念。在日常开发过程中我们肯定会用到Activity,但是关于Activity的一些细节问题运行机制我们可能还有一些不清楚的问题。今天…

调用百度文心AI作画API实现中文-图像跨模态生成

作者介绍 乔冠华,女,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组。 研究方向:机器视觉与人工智能。 电子邮件:1078914066qq.com 一.文心AI作画API介绍 1. 文心AI作画 文…

全开源ChatGPT聊天机器人商业版源码/支持魔改/完全开放源代码

🎈 限时活动领体验会员:可下载程序网创项目短视频素材 🎈 ☑️ 品牌:ChatGPT ☑️ 语言:PHP ☑️ 类型:ChatGPT ☑️ 支持:PCWAP 🎉 有需要的朋友记得关赞评,需要的底部获…

C++哈希

目录 一、认识哈希表 1.unordered_set和unordered_map 2.哈希表的概念 二、闭散列哈希表的实现 1.底层本质 (1)哈希表的存储结构 (2)元素的插入与查找 (3)哈希冲突 (4)负载…

深入浅出C++ ——线程库

文章目录 线程库thread类的简单介绍线程函数参数原子性操作库 mutex的种类std::mutexstd::recursive_mutexstd::timed_mutexstd::recursive_timed_mutex lock_guard与unique_locklock_guardunique_lock condition_variable 线程库 thread类的简单介绍 在C11之前,涉…

“广东省五一劳动奖章”获得者卫晓欣:“她”力量让新兴技术更获认可

近日,2023年广东省庆祝“五一”国际劳动节暨五一劳动奖表彰大会顺利召开,大会表彰了2023年全国和省五一劳动奖、工人先锋号代表。 其中,来自FISCO BCOS开源社区产业应用合作伙伴广电运通的创新中心总监卫晓欣,凭借在区块链领域的…

分布式锁Redisson对于(不可重入、不可重试、超时释放、主从一致性)四个问题的应对

文章目录 1 Redisson介绍2 Redisson快速入门3 Redisson可重入锁原理4 Redisson锁重试和WatchDog机制5 Redisson锁的MutiLock原理 基于setnx实现的分布式锁存在下面的问题: 重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff…

Ai作图可控性演进——从SD到MJ

背景 Ai作图从Diffusion模型开始,作图进入稳步发展快车道。然后用过diffusion系列作图的同学对产图稳定性,以及可控性都会颇有微词。diffusion系列作图方法在宏观层面上确实能够比较好的做出看上去还不错的图。然后当你细抠细节时候,发现这东…

远程服务器搭建jupyter lab并在本地访问

1、安装jupyter pip install jupyter 可以直接在base环境下安装 2、配置jupyter 2.1 密钥生成 进入python交互模式,输入以下代码: from jupyter_server.auth import passwd passwd()然后输入密码,得到一串密钥,保存一下 2.2…

Java多线程入门到精通学习大全?了解几种线程池的基本原理、代码示例!(第五篇:线程池的学习)

本文介绍了Java中三种常用的线程池:FixedThreadPool、CachedThreadPool和ScheduledThreadPool,分别介绍了它们的原理、代码示例以及使用注意事项。FixedThreadPool适用于并发量固定的场景,CachedThreadPool适用于执行时间短的任务&#xff0c…

Linux C/C++后台开发面试重点知识

Linux C/C后台开发面试重点知识 文章转载自个人博客: Linux C/C后台开发面试重点知识 查看目录 一、C 面试重点 本篇主要是关于 C 语言本身,如果是整个后台技术栈的学习路线,可以看这篇文章: Linux C 后台开发学习路线 对于 C 后台开发面试来说&…

27岁转行学云计算值得吗?能就业不?

27岁转行学云计算值得吗?能就业不? 首先,云计算当然值得转行了,如此肯定的观点,应该没有人会反对吧,尤其是对IT行业的现状以及就业市场有所了解的人。如果你对这一点有所怀疑也很正常,只要通过各…

Spring Boot集成ShardingSphere分片利器 AutoTable (一)—— 简单体验 | Spring Cloud 45

一、背景 Sharding是 Apache ShardingSphere 的核心特性,也是 ShardingSphere 最被人们熟知的一项能力。在过去,用户若需要进行分库分表,一种典型的实施流程(不含数据迁移)如下: 用户需要准确的理解每一张…

详解快速排序的类型和优化

详解快速排序的优化 前言快排的多种写法霍尔法实现快排代码部分 挖坑法思路讲解代码部分 双指针法思路讲解代码部分 针对排序数类型的优化针对接近或已经有序数列和逆序数列三数取中代码实现 随机数 针对数字中重复度较高的数三路划分思路讲解代码部分 根据递归的特点进行优化插…

JSP招投标管理系统myeclipse开发mysql数据库WEB结构java编程

一、源码特点 JSP 招投标管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 JSP招投标管理系统myeclipse开发mysql数据库W 二、功能介绍 主要功能: …