当前位置: 首页 > news >正文

Python项目——计算器(PySide6+Pyinstaller)

1、介绍

  • 使用python编写一个计算器,可以实现基本的运算。
  • 【注】该项目最终还有一些细小的bug没有完善,例如符号可以一直输入。

2、实现

  • 使用pyCharm创建一个新的项目。 
2.1、设计UI
  • 使用Qt designer设计一个UI界面,保存ui文件,再转换为py文件并保存到项目目录中,供后续使用。
    • 具体方法:Pyside6入门教学——编写一个UI界面并显示-CSDN博客

  • 生成的py文件如下: 
    • # -*- coding: utf-8 -*-################################################################################
      ## Form generated from reading UI file 'untitled.ui'
      ##
      ## Created by: Qt User Interface Compiler version 6.6.1
      ##
      ## WARNING! All changes made in this file will be lost when recompiling UI file!
      ################################################################################from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,QMetaObject, QObject, QPoint, QRect,QSize, QTime, QUrl, Qt)
      from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,QFont, QFontDatabase, QGradient, QIcon,QImage, QKeySequence, QLinearGradient, QPainter,QPalette, QPixmap, QRadialGradient, QTransform)
      from PySide6.QtWidgets import (QApplication, QLineEdit, QMainWindow, QMenuBar,QPushButton, QSizePolicy, QStatusBar, QWidget)class Ui_MainWindow(object):def setupUi(self, MainWindow):if not MainWindow.objectName():MainWindow.setObjectName(u"MainWindow")MainWindow.resize(300, 350)MainWindow.setMinimumSize(QSize(300, 350))MainWindow.setMaximumSize(QSize(300, 350))self.centralwidget = QWidget(MainWindow)self.centralwidget.setObjectName(u"centralwidget")self.lineEdit = QLineEdit(self.centralwidget)self.lineEdit.setObjectName(u"lineEdit")self.lineEdit.setGeometry(QRect(30, 20, 241, 41))self.lineEdit.setMinimumSize(QSize(0, 0))self.lineEdit.setReadOnly(True)self.seven = QPushButton(self.centralwidget)self.seven.setObjectName(u"seven")self.seven.setGeometry(QRect(30, 130, 51, 41))self.eight = QPushButton(self.centralwidget)self.eight.setObjectName(u"eight")self.eight.setGeometry(QRect(90, 130, 51, 41))self.nine = QPushButton(self.centralwidget)self.nine.setObjectName(u"nine")self.nine.setGeometry(QRect(150, 130, 51, 41))self.exc = QPushButton(self.centralwidget)self.exc.setObjectName(u"exc")self.exc.setGeometry(QRect(210, 130, 61, 41))self.six = QPushButton(self.centralwidget)self.six.setObjectName(u"six")self.six.setGeometry(QRect(150, 180, 51, 41))self.four = QPushButton(self.centralwidget)self.four.setObjectName(u"four")self.four.setGeometry(QRect(30, 180, 51, 41))self.mul = QPushButton(self.centralwidget)self.mul.setObjectName(u"mul")self.mul.setGeometry(QRect(210, 180, 61, 41))self.five = QPushButton(self.centralwidget)self.five.setObjectName(u"five")self.five.setGeometry(QRect(90, 180, 51, 41))self.three = QPushButton(self.centralwidget)self.three.setObjectName(u"three")self.three.setGeometry(QRect(150, 230, 51, 41))self.one = QPushButton(self.centralwidget)self.one.setObjectName(u"one")self.one.setGeometry(QRect(30, 230, 51, 41))self.sub = QPushButton(self.centralwidget)self.sub.setObjectName(u"sub")self.sub.setGeometry(QRect(210, 230, 61, 41))self.two = QPushButton(self.centralwidget)self.two.setObjectName(u"two")self.two.setGeometry(QRect(90, 230, 51, 41))self.equal = QPushButton(self.centralwidget)self.equal.setObjectName(u"equal")self.equal.setGeometry(QRect(150, 280, 51, 41))self.zero = QPushButton(self.centralwidget)self.zero.setObjectName(u"zero")self.zero.setGeometry(QRect(30, 280, 51, 41))self.add = QPushButton(self.centralwidget)self.add.setObjectName(u"add")self.add.setGeometry(QRect(210, 280, 61, 41))self.point = QPushButton(self.centralwidget)self.point.setObjectName(u"point")self.point.setGeometry(QRect(90, 280, 51, 41))self.clear = QPushButton(self.centralwidget)self.clear.setObjectName(u"clear")self.clear.setGeometry(QRect(30, 80, 111, 41))self.back = QPushButton(self.centralwidget)self.back.setObjectName(u"back")self.back.setGeometry(QRect(210, 80, 61, 41))MainWindow.setCentralWidget(self.centralwidget)self.menubar = QMenuBar(MainWindow)self.menubar.setObjectName(u"menubar")self.menubar.setGeometry(QRect(0, 0, 300, 21))MainWindow.setMenuBar(self.menubar)self.statusbar = QStatusBar(MainWindow)self.statusbar.setObjectName(u"statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QMetaObject.connectSlotsByName(MainWindow)# setupUidef retranslateUi(self, MainWindow):MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u8ba1\u7b97\u5668", None))self.seven.setText(QCoreApplication.translate("MainWindow", u"7", None))self.eight.setText(QCoreApplication.translate("MainWindow", u"8", None))self.nine.setText(QCoreApplication.translate("MainWindow", u"9", None))self.exc.setText(QCoreApplication.translate("MainWindow", u"\u00f7", None))self.six.setText(QCoreApplication.translate("MainWindow", u"6", None))self.four.setText(QCoreApplication.translate("MainWindow", u"4", None))self.mul.setText(QCoreApplication.translate("MainWindow", u"\u00d7", None))self.five.setText(QCoreApplication.translate("MainWindow", u"5", None))self.three.setText(QCoreApplication.translate("MainWindow", u"3", None))self.one.setText(QCoreApplication.translate("MainWindow", u"1", None))self.sub.setText(QCoreApplication.translate("MainWindow", u"-", None))self.two.setText(QCoreApplication.translate("MainWindow", u"2", None))self.equal.setText(QCoreApplication.translate("MainWindow", u"=", None))self.zero.setText(QCoreApplication.translate("MainWindow", u"0", None))self.add.setText(QCoreApplication.translate("MainWindow", u"+", None))self.point.setText(QCoreApplication.translate("MainWindow", u".", None))self.clear.setText(QCoreApplication.translate("MainWindow", u"C", None))self.back.setText(QCoreApplication.translate("MainWindow", u"DEL", None))# retranslateUi
2.2、编写代码
  • 在项目目录下创建一个main.py文件。 
    • from PySide6.QtWidgets import QApplication, QMainWindow
      from ui import Ui_MainWindow
      import sysclass MainWindow(QMainWindow):def __init__(self):super(MainWindow, self).__init__()self.ui = Ui_MainWindow()  # UI类的实例化self.ui.setupUi(self)self.result = ''  # 计算结果self.numberResult = 0self.bind()  # 绑定函数,不让初始化中的代码过多# 绑定def bind(self):# lambda的作用是连接一个临时函数self.ui.zero.clicked.connect(lambda: self.addNumber('0'))  # 0self.ui.one.clicked.connect(lambda: self.addNumber('1'))  # 1self.ui.two.clicked.connect(lambda: self.addNumber('2'))  # 2self.ui.three.clicked.connect(lambda: self.addNumber('3'))  # 3self.ui.four.clicked.connect(lambda: self.addNumber('4'))  # 4self.ui.five.clicked.connect(lambda: self.addNumber('5'))  # 5self.ui.six.clicked.connect(lambda: self.addNumber('6'))  # 6self.ui.seven.clicked.connect(lambda: self.addNumber('7'))  # 7self.ui.eight.clicked.connect(lambda: self.addNumber('8'))  # 8self.ui.nine.clicked.connect(lambda: self.addNumber('9'))  # 9self.ui.add.clicked.connect(lambda: self.addNumber('+'))  # 加self.ui.sub.clicked.connect(lambda: self.addNumber('-'))  # 减self.ui.mul.clicked.connect(lambda: self.addNumber('*'))  # 乘self.ui.exc.clicked.connect(lambda: self.addNumber('/'))  # 除self.ui.point.clicked.connect(lambda: self.addNumber('.'))  # 小数点self.ui.equal.clicked.connect(lambda: self.equal())  # 等于self.ui.back.clicked.connect(lambda: self.back())  # 回退self.ui.clear.clicked.connect(lambda: self.clear())  # 清除# 输入表达式def addNumber(self, number):self.ui.lineEdit.clear()self.result += numberself.ui.lineEdit.setText(self.result)# 计算def equal(self):self.numberResult = eval(self.result)  # 计算结果self.ui.lineEdit.setText(str(self.numberResult))# 回退def back(self):self.result = self.result[:-1]  # 移除最后一个元素self.ui.lineEdit.setText(self.result)# 清除def clear(self):self.ui.lineEdit.clear()self.result = ''self.ui.lineEdit.setText(self.result)if __name__ == '__main__':app = QApplication([])  # 启动一个应用window = MainWindow()  # 实例化主窗口window.show()  # 展示主窗口sys.exit(app.exec())  # 关闭窗口,程序停止运行

3、打包

  • 将该项目打包成一个exe可执行文件。打开终端,进入主函数所在路径。
    • pyinstaller -F -w main.py
      # -F:打包成单个文件
      # -w:打开时不显示终端
  • 生成一个dist文件夹,其中包含了exe文件。

相关文章:

  • 盖子的c++小课堂:第二十六讲:双向链表
  • JavaEE-微服务-Vuex
  • 浅谈拨测在网络安全中的应用
  • 最强生产力|卸载并重装Anaconda3
  • LeetCode.670. 最大交换
  • “深入理解RabbitMQ交换机的原理与应用“
  • mysql 导入数据 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘
  • 【江科大】STM32:中断系统(理论)
  • 5G随身WiFi都是骗人的?5G随身WiFi靠谱品牌推荐,哪个5G随身WiFi最好用
  • SPA vs MPA vs PWA
  • 基于SpringBoot的药品管理系统
  • 【笔记】stable_baseline 记录输出说明
  • 软考系分之计算机网络规划设计、综合布线、RAID和网络存储等
  • 大数据学习之Flink、比较不同框架的容错机制
  • 1 认识微服务
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2017年终总结、随想
  • CEF与代理
  • Fundebug计费标准解释:事件数是如何定义的?
  • git 常用命令
  • Java Agent 学习笔记
  • java第三方包学习之lombok
  • Java反射-动态类加载和重新加载
  • Linux链接文件
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Phpstorm怎样批量删除空行?
  • RxJS: 简单入门
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 类orAPI - 收藏集 - 掘金
  • 面试总结JavaScript篇
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何胜任知名企业的商业数据分析师?
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 赢得Docker挑战最佳实践
  • 2017年360最后一道编程题
  • hi-nginx-1.3.4编译安装
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • postgresql行列转换函数
  • Spring Batch JSON 支持
  • 我们雇佣了一只大猴子...
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #NOIP 2014# day.2 T2 寻找道路
  • $().each和$.each的区别
  • (2)(2.10) LTM telemetry
  • (C#)一个最简单的链表类
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (七)c52学习之旅-中断
  • (四)汇编语言——简单程序
  • (五)网络优化与超参数选择--九五小庞