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)
          # 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文件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于docker,k8s 搭建服务(单体docker-compose编排)

1、 yum -y install gcc yum -y instacc gcc-c 2、安装yum 工具 yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken 3、设置docker镜像仓库 阿里云 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.…

四种方法将 Docker Registry 迁移至 Harbor

Registry Docker Distribution Docker Distribution 是第一个是实现了打包、发布、存储和镜像分发的工具,起到 docker registry 的作用。(目前 Distribution 已经捐赠给了 CNCF)。其中 Docker Distribution 中的 spec 规范后来也就成为了 O…

Leetcode 2788. 按分隔符拆分字符串

我们可以先自己模拟一下分隔字符串的过程。如果只是简单的,遇到分隔符,将分隔符前后的子串加入结果的List,那么很显然并没有考虑到一个String中有多个字符串的情况。一种比较容易想到的方法是: 先对List中每个字符串遍历&#xf…

HBase节点故障的容错方案

HBase节点故障的容错方案 1. Master高可用1.1 选主和HA切换逻辑 2. RS高可用2.1 感知RS节点异常2.2 异常DN上的数据处理 4. 疑问和思考5. 参考文档 本文主要探讨hbase集群的高可用容错方案和容错能力的探讨。涉及Master和RS相关组件,在出现单机故障时相关的容错方案…

Node.js Stream.pipeline() Method

Why Stream.pipeline 通过流我们可以将一大块数据拆分为一小部分一点一点的流动起来,而无需一次性全部读入,在 Linux 下我们可以通过 | 符号实现,类似的在 Nodejs 的 Stream 模块中同样也为我们提供了 pipe() 方法来实现。 未使用 Stream p…

实时云渲染服务:流式传输 VR 和 AR 内容

想象一下无需专用的物理计算机,甚至无需实物连接,就能获得高质量的 AR/VR 体验是种什么样的体验? 过去,与 VR 交互需要专用的高端工作站,并且根据头显、壁挂式传感器和专用的物理空间。VR 中的复杂任务会突破传感器范…

快速傅里叶变化检测轻微划痕

像这种轻微划痕,普通算法鲁棒性差,通用性也不是很好,通过一些特殊处理,基本上可以满足客户需求. 图像处理,检测无非这个几个步骤. 预处理----分割----筛选—满足设定条件NG read_image (Image, ‘轻微划痕.bmp’) dev_close_window() get_image_size(Image, Width, Height) dev…

Chatgpt+Comfyui绘图源码线上部署文档

源码仓库: https://gitee.com/BTYY/wailikeji-chatgpt 其他文档地址: ChatgptComfyui绘图源码运营文档 ChatgptComfyui绘图源码说明及本地部署文档 一、云服务器购买 (一)购买云服务 有两种部署方案,不同方案对服务…

【MongoDB】下载安装、指令操作

目录 1.下载安装 2.指令 2.1.基础操作指令 2.2.增加 2.3.查询 2.4.修改 2.5.删除 前言: 关于MongoDB的核心概念请移步: 【文档数据库】ES和MongoDB的对比-CSDN博客 1.下载安装 本文以安装Windows版本的mongodb为例,Linux版本的其实…

IP劫持的危害分析及应对策略

在当今数字化时代,网络安全问题备受关注,其中IP劫持是一种常见而危险的威胁。本文将深入探讨IP劫持的危害,并提供一些有效的应对策略。 第一部分:IP劫持的定义 IP劫持是指黑客通过各种手段获取并篡改目标IP地址的控制权&#xf…

如何在地图资源下载工具中下载和共享自定义资源

在获取GIS或遥感资源时,有时候可能会有一些您自己的下载资源!您也可以在地图资源下载工具增加这些下载资源!这样既可以方便以后下载,也可以与其它人分享下载资源! 设置方式如下: 下载方式如下:…

【汇编】 13.3 对int iret和栈的深入理解

书中示例 assume cs:codecode segment start:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset end0-offset lpcldrep movsb ;lp到end0的指令传送到0:200处mov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*42],0 ;设置7c表项…

NeRF - 神经辐射场 原理分析与解释

标题:NeRF:Representing Scenes as Neural Radiance Fields for View Synthesis 顾名思义:通过NeRF 神经辐射场合成新视角来表达场景 这是一篇来源于伯克利大学的论文研究 摘要 论文提出了一种方法,可以通过优化一个连续体积场…

力扣每日一题---1547. 切棍子的最小成本

//当我们将棍子分段之后,我们是不是想到了怎么组合这些棍子 //并且这些棍子有一个性质就是只能与相邻的进行组合 //暴力搜索的话复杂度很高 //在思考暴力搜索的时候,我们发现一个规律 //比如棍子长度1 2 1 1 2 //那么与最后一个2组合的棍子有&#xff0c…

「绝世唐门」七怪一死六伤,98级玄子饕餮真身,伊莱克斯宣布神位

Hello,小伙伴们,我是拾荒君。 《斗罗大陆Ⅱ绝世唐门》第32期超前爆料,据透露史莱克监察团深入邪魂师的老巢,发现许多城中的百姓遭到残忍的毒手。为了对抗这些残忍的邪魂师,史莱克监察团成员纷纷发动武魂,展现出强大的…

人工智能原理实验2(1)——八数码问题(BFS、DFS、UCS、IDS、A*算法)

🧡🧡实验内容🧡🧡 要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态(左)到目标状态(右) 🧡🧡BFS、DFS实现🧡…

使用Scrapy 爬取“http://tuijian.hao123.com/”网页中左上角“娱乐”、“体育”、“财经”、“科技”、历史等名称和URL

一、网页信息 二、检查网页,找出目标内容 三、根据网页格式写正常爬虫代码 from bs4 import BeautifulSoup import requestsheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/53…

恢复因各种情况丢失的数据和文件的恢复软件汇集。

数据和文件恢复软件工具是直观的应用程序,可以从各种存储介质中恢复有价值且敏感的业务相关数据。这些宝贵的救生应用程序使企业能够恢复因不可预测的情况而丢失的数据。 存储介质解决方案可能会因网络攻击、病毒、数据泄露、硬盘故障等多种原因而丢失或损坏数据。…

Dart安装(Winodws)

Dart官网: https://dart.dev/ 一、命令行安装 https://dart.dev/get-dart You can install the Dart SDK using Chocolatey. error Important: These commands require administrator rights. Here’s one way to open a Command Prompt window that has admin …

ROS第 12 课 Launch 启动文件的使用方法

文章目录 第 12 课 Launch 启动文件的使用方法1.本节前言2.Lanuch 文件基本语法2.2 参数设置2.3 重映射嵌套 3.实操练习 第 12 课 Launch 启动文件的使用方法 1.本节前言 我们在前面的教程里面通过命令行来尝试运行新的节点。但随着创建越来越复杂的机器人系统中,打…