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

news2024/9/22 7:27:59

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)
          # setupUi
      
          def 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 sys
      
      
      class MainWindow(QMainWindow):
          def __init__(self):
              super(MainWindow, self).__init__()
              self.ui = Ui_MainWindow()  # UI类的实例化
              self.ui.setupUi(self)
              self.result = ''  # 计算结果
              self.numberResult = 0
              self.bind()  # 绑定函数,不让初始化中的代码过多
      
          # 绑定
          def bind(self):
              # lambda的作用是连接一个临时函数
              self.ui.zero.clicked.connect(lambda: self.addNumber('0'))  # 0
              self.ui.one.clicked.connect(lambda: self.addNumber('1'))  # 1
              self.ui.two.clicked.connect(lambda: self.addNumber('2'))  # 2
              self.ui.three.clicked.connect(lambda: self.addNumber('3'))  # 3
              self.ui.four.clicked.connect(lambda: self.addNumber('4'))  # 4
              self.ui.five.clicked.connect(lambda: self.addNumber('5'))  # 5
              self.ui.six.clicked.connect(lambda: self.addNumber('6'))  # 6
              self.ui.seven.clicked.connect(lambda: self.addNumber('7'))  # 7
              self.ui.eight.clicked.connect(lambda: self.addNumber('8'))  # 8
              self.ui.nine.clicked.connect(lambda: self.addNumber('9'))  # 9
              self.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 += number
              self.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文件。

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

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

相关文章

electron-vite中的ipc通信

1. 概述 再electron中,进程间的通信通过ipcMain和ipcRenderer模块,这些通道是任意和双向的 1.1. 什么是上下文隔离进程 ipc通道是通过预加载脚本绑定到window对象的electron对象属性上的 2. 通信方式 2.1. ipcMain(也就是渲染进程向主进…

福昕软件的使用

快捷操作 快捷键 快捷键功能备注Ctrl P打印 Ctrl W关闭 Ctrl B书签 鼠标放菜单栏,单击右键即可导入/导出 自定义菜单栏文件-->偏好设置-->文档 1、多实例:单击PDF后均重新打开一个新界面。

数字图像处理期末速成笔记

目录 一、基础知识二、相邻像素间基本关系三、图像增强方法1、直方图求解2、直方图均衡化3、直方图规定化4、图像平滑5、邻域平均法(线性)6、 中值滤波法(分线性)7、中值滤波与领域平均的异同8、4-邻域平滑法9、超限像素平滑法10、…

C++ BuilderXE关于FDQuery组件记录限制设定

这样修改就可以查询返回所有记录。 TFDQuery.RecordCount,或TDateSet.RecordCount只显示了可见的50条数据,但实际上数据的总量超过了这个数量。为了解决这个问题,我们可以通过更改TFDConection.FetchOptions.RecordCountMode属性为fmTotal,以…

多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计…

Elasticsearch 入门向使用

文章目录 ElasticSearch简介倒排索引安装(单节点)分词器kibana与Mysql概念上的对比索引库CRUD文档CRUDDSL查询相关性算分Function Score Query自定义算分Boolean Query 搜索结果处理排序分页高亮 数据聚合 aggregations自动补全数据同步集群 ElasticSearch 简介 Elasticsearc…

java SSM园林绿化管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM园林绿化管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代 码和数据库,系统主要采…

【论文阅读】GPT4Graph: Can Large Language Models Understand Graph Structured Data?

文章目录 0、基本介绍1、研究动机2、准备2.1、图挖掘任务2.2、图描述语言(GDL) 3、使用LLM进行图理解流程3.1、手动提示3.2、自提示 4、图理解基准4.1、结构理解任务4.1、语义理解任务 5、数据搜集5.1、结构理解任务5.2、语义理解任务 6、实验6.1、实验设…

Spark面试题

1. spark core 1.简述hadoop 和 spark的不同点(为什么spark更快)♥♥♥ shuffle都是需要落盘的,因为在宽依赖中需要将上一个阶段的所有分区数据都准备好,才能进入下一个阶段,那么如果一直将数据放在内存中&#xff0c…

ARM多核调度器DSU

1. 背景 从A75开始,ARM提出了一个新的多核心管理系统单元,叫做DSU(DynamIQ Shared Unit)。DSU的核心功能是控制CPU内核,使其成簇Cluster使用,簇内每一个核心可以单独开关、调整频率/电压,能效表现更佳,甚至…

手动正则删除console.log

依赖删除的可以先出去了 先得删除箭头函数里的 正则匹配不能直接删,如这种箭头函数,得先全局改了 然后正则 console.log(.*?) 选中》空着〉全局替换 最后删除 // 因为有的 console.log在代码块原来就是被空着状态, 所以也得全局为空替…

正则表达式..

1.字符串的合法检验 现在有一个字符串验证码 我们需要检验其的合法性 什么条件才能够使得字符串合法呢?就是6-10个字符串长度 并且以字母开头 并且其中由字母、数字、下划线构成 那么我们可以先通过自定义的方式进行检验 public class Main {public static void m…

通过Konva.js实现canvas列表滚动

列表可以通过Konva.js中的Rect来实现,通过group可以丰富列表的内容 在滚动方面,可以通过vue的scroll方法,通过rect中的move方法来修改y值即可 我这里设置的是一个透明的盒子在想要滚动的canvas上,这样就可以实现直接滚动canvas列…

K8s(七)四层代理Service

Service概述 Service在Kubernetes中提供了一种抽象的方式来公开应用程序的网络访问,并提供了负载均衡和服务发现等功能,使得应用程序在集群内外都能够可靠地进行访问。 每个Service都会自动关联一个对应的Endpoint。当创建一个Service时,Ku…

springboot109新闻稿件管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的新闻稿件管理系统 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获…

SpringMVC下半篇之整合ssm

4.ssm整合 4.1.创建表 CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,money double DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;4.2.创建工程 4.3.pom.xml <?xml version"1.0" encoding&…

【图形学】颜色线性插值和Wu反走样算法

颜色线性插值 绘制一条颜色渐变的直线&#xff0c;直线上每一个点的颜色都来自端点颜色的线性插值。线性插值公式为 P ( 1 − t ) P s t a r t t P e n d P 是直线上任意一个点&#xff0c; P s t a r t 是直线的起点&#xff0c; P e n d 是直线的终点 对应直线上任意一点…

[flutter]GIF速度极快问题的两种解决方法

原因&#xff1a; 当GIF图没有设置播放间隔时间时&#xff0c;电脑上会默认间隔0.1s&#xff0c;而flutter默认0s。 解决方法一&#xff1a; 将图片改为webp格式。 解决方法二&#xff1a; 为图片设置帧频率&#xff0c;添加播放间隔。例如可以使用GIF依赖组件设置每秒运行…

低代码技术杂谈

一、探讨低代码的定义 “Low-Code”是什么&#xff1f;身为技术人员听到这种技术名词&#xff0c;咱们第一反应就是翻看维基百科 或者其他相关技术论文&#xff0c;咱们想看维基百科的英文介绍&#xff1a; A low-code development platform (LCDP) provides a development env…

Docker(七)使用网络

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Docker 中的网络功能介绍 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。 一、外部访问容器 容器中可以运行一些网络应用&…