从零基础学习PyQt5软件app开发

news2025/1/16 0:59:30

在这里插入图片描述

常见的GUI框架的梳理

GUI,全称为图形⽤户界⾯,⼜称为图形⽤户接⼝,是⼀种⼈与计算机通信的界⾯显示格式。
⽤户打开应⽤程序或⽹站时看到的第⼀个东⻄,并与之交互。
⽤户界⾯通常包括许多视觉元素,如图标、按钮、图形、显示⽂本和其他⼏种输⼊形式,如复选
框、⽂本输⼊框等。
Python有⼤量⽤于开发GUI的框架,我们在下⾯的列表中收集了⼀些最流⾏的Python GUI框架。

PyQt5

Python 对跨平台的 GUI ⼯具集 Qt 的包装实现了 440 个类以及 6000 个函数或者⽅法 ,PyQt 是
作为 Python 的插件实现的。
功能⾮常强⼤,Qt开发多美漂亮的界⾯,也就可以⽤PyQt开发多么漂亮的界⾯。
跨平台的⽀持很好。

Tkiner

绑定了 Python 的 Tk GUI ⼯具集 ,就是Python 包装的Tcl代码。
历史最悠久, Python 事实上的标准 GUI
不⽀持拖拽,所有GUI界⾯设计都必须⼿写代码

Pyside

另⼀个 Python 对跨平台的 GUI ⼯具集 Qt 的包装。
如果不做商业项⽬,强烈建议使⽤PyQt,资料多,稳定。需要开发闭源商⽤软件的就⽤PySide。

wxPYTHON

Python 对跨平台的 GUI ⼯具集 wxWidgets ( C++ 编写)的包装。
⽐较流⾏的⼀个 Tkinter 的替代品,在各种平台下表现挺好。

PyGTK

⼀系列的 Python 对 GTK+ GUI 库的包装。
在windows下表现⼀般

PyQt5

第⼀点:在PyQt中编写UI界⾯可以直接通过代码来实现,也可以通过Qt Designer来完成。
第⼆点:Qt Designer的设计符合MVC的架构,其实现了视图和逻辑的分离,从⽽实现了开发的便
捷。Qt Designer中的操作⽅式⼗分灵活,其通过拖拽的⽅式放置控件可以随时查看控件效果。
第三点:Qt Designer⽣成的.ui⽂件(实质上是XML格式的⽂件)也可以通过pyuic5⼯具转换
成.py⽂件。

配置PyQt5(windows和mac系统上的操作)

不管在Windows,还是在MAC系统下,安装了anaconda后,QtDesigner都会被安装。
所以这就是从⼀开始我就推荐⼤家安装anaconda的原因,能省去⼤家不少后续安装软件的麻烦。
既然已经安装了,剩下的问题就是找到QtDesigner的启动路径。
在Windows下,启动QtDesigner的路径是:
D:\anaconda\Library\bin
上⾯(D:\anaconda)是我在windows下的anaconda安装路径,⼤家需要替换为⾃⼰的
如下图所示:
在这里插入图片描述
在MAC下,启动路径是:
/Users/ksy/anaconda3/bin/Designer.app
上⾯(/Users/zhenguo/anaconda3)是我的anaconda安装路径,⼤家需要替换为⾃⼰的
如果每次都要去找到这个路径,然后启动,在PyCharm开发中,不是很⽅便。
PyCharm作为⼀个好⽤的开发利器,能帮助我们解决这个每次都要找路径然后启动的问题。
具体操作步骤,如下所示:
第⼀步:打开PyCharm
第⼆步:点击左上⻆:File
第三步:Windows选择Settings,MAC系统选择Preferences
第四步:弹出来界⾯,左侧界⾯,选择Tools,点开后选择External Tools
第五步:在弹出下⾯对话框中,依次填写:
Name:QtDesigner
Group:Qt
Program:填写上⾯QtDesigner的启动路径,在MAC下,启动路径是:
/Users/zhenguo/anaconda3/bin/Designer.app
在Windows下启动路径是:
D:\anaconda\Library\bin
Working directory:ProjectFileDir
整个界⾯填写完成后,如下所示:
在这里插入图片描述

利用QtDesigner设计一个计算器

在这里插入图片描述

ui文件转化为py文件

为什么需要将ui⽂件转为py⽂件?
如何转?
pyuic5 untitled.ui -o mainForm.py

Pycharm配置实现ui文件的自动转化py文件

在这里插入图片描述
Program:
Windows系统: D:\anaconda\bin\python.exe
MAC系统下: /Users/zhenguo/anaconda3/bin/python
Arguments:
-m PyQt5.uic.pyuic F i l e N a m e FileName FileName -o F i l e N a m e W i t h o u t E x t e n s i o n FileNameWithoutExtension FileNameWithoutExtension.py
Working directory:
F i l e D i r FileDir FileDir

Pycharm最终的运行效果

在这里插入图片描述

信号和槽函数

信号(Signal)和槽(Slot)是Qt中的核⼼机制,也是在PyQt编程中对象之间进⾏通信的机制。
在Qt中,每⼀个QObject对象和PyQt中所有继承⾃QWidget的控件都⽀持信号与槽机制。当信号
发射时,连接的槽函数将会⾃动执⾏。通过object.signal.connect()⽅法连接。
当事件或状态发⽣改变时,就会发出信号。同时,信号会触发所有与这个事件(信号)相关的函
数(槽)。信号与槽可以是多对多的关系。
在这里插入图片描述

使用QtDesigner操作信号和槽函数

在这里插入图片描述

PyQt5开发一个计算器软件

在这里插入图片描述

在这里插入图片描述

项目的整体架构

-计算器软件
– logic.py
– main.py
– 计算器设计.py
– j计算器设计.ui

计算设计.ui

本文件主要是由QtDesigner实现的

计算器设计.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '计算器设计.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


```python
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(783, 604)
        font = QtGui.QFont()
        font.setFamily("Arial Narrow")
        MainWindow.setFont(font)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 50, 781, 500))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton_eq = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_eq.sizePolicy().hasHeightForWidth())
        self.pushButton_eq.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_eq.setFont(font)
        self.pushButton_eq.setObjectName("pushButton_eq")
        self.gridLayout.addWidget(self.pushButton_eq, 5, 2, 1, 2)
        self.pushButton_add = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_add.sizePolicy().hasHeightForWidth())
        self.pushButton_add.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_add.setFont(font)
        self.pushButton_add.setObjectName("pushButton_add")
        self.gridLayout.addWidget(self.pushButton_add, 4, 3, 1, 1)
        self.pushButton_7 = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_7.sizePolicy().hasHeightForWidth())
        self.pushButton_7.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_7.setFont(font)
        self.pushButton_7.setStyleSheet("color: rgb(85, 170, 255);")
        self.pushButton_7.setObjectName("pushButton_7")
        self.gridLayout.addWidget(self.pushButton_7, 1, 0, 1, 1)
        self.pushButton_sub = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_sub.sizePolicy().hasHeightForWidth())
        self.pushButton_sub.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_sub.setFont(font)
        self.pushButton_sub.setObjectName("pushButton_sub")
        self.gridLayout.addWidget(self.pushButton_sub, 2, 3, 1, 1)
        self.pushButton_0 = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_0.sizePolicy().hasHeightForWidth())
        self.pushButton_0.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_0.setFont(font)
        self.pushButton_0.setStyleSheet("color: rgb(85, 170, 255);")
        self.pushButton_0.setObjectName("pushButton_0")
        self.gridLayout.addWidget(self.pushButton_0, 5, 0, 1, 1)
        self.pushButton_perc = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_perc.sizePolicy().hasHeightForWidth())
        self.pushButton_perc.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        font.setBold(False)
        font.setWeight(50)
        self.pushButton_perc.setFont(font)
        self.pushButton_perc.setFocusPolicy(QtCore.Qt.NoFocus)
        self.pushButton_perc.setObjectName("pushButton_perc")
        self.gridLayout.addWidget(self.pushButton_perc, 5, 1, 1, 1)
        self.pushButton_1 = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_1.sizePolicy().hasHeightForWidth())
        self.pushButton_1.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_1.setFont(font)
        self.pushButton_1.setStyleSheet("color: rgb(85, 170, 255);")
        self.pushButton_1.setObjectName("pushButton_1")
        self.gridLayout.addWidget(self.pushButton_1, 4, 0, 1, 1)
        self.pushButton_8 = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_8.sizePolicy().hasHeightForWidth())
        self.pushButton_8.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_8.setFont(font)
        self.pushButton_8.setStyleSheet("color: rgb(85, 170, 255);")
        self.pushButton_8.setObjectName("pushButton_8")
        self.gridLayout.addWidget(self.pushButton_8, 1, 1, 1, 1)
        self.pushButton_9 = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_9.sizePolicy().hasHeightForWidth())
        self.pushButton_9.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_9.setFont(font)
        self.pushButton_9.setStyleSheet("color: rgb(85, 170, 255);")
        self.pushButton_9.setObjectName("pushButton_9")
        self.gridLayout.addWidget(self.pushButton_9, 1, 2, 1, 1)
        self.pushButton_M = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_M.sizePolicy().hasHeightForWidth())
        self.pushButton_M.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_M.setFont(font)
        self.pushButton_M.setStyleSheet("color: rgb(85, 170, 255);\n"
"color: rgb(170, 85, 0);")
        self.pushButton_M.setObjectName("pushButton_M")
        self.gridLayout.addWidget(self.pushButton_M, 0, 1, 1, 1)
        self.pushButton_5 = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_5.sizePolicy().hasHeightForWidth())
        self.pushButton_5.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_5.setFont(font)
        self.pushButton_5.setStyleSheet("color: rgb(85, 170, 255);")
        self.pushButton_5.setObjectName("pushButton_5")
        self.gridLayout.addWidget(self.pushButton_5, 2, 1, 1, 1)
        self.pushButton_6 = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_6.sizePolicy().hasHeightForWidth())
        self.pushButton_6.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_6.setFont(font)
        self.pushButton_6.setStyleSheet("color: rgb(85, 170, 255);")
        self.pushButton_6.setObjectName("pushButton_6")
        self.gridLayout.addWidget(self.pushButton_6, 2, 2, 1, 1)
        self.pushButton_RE = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_RE.sizePolicy().hasHeightForWidth())
        self.pushButton_RE.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_RE.setFont(font)
        self.pushButton_RE.setStyleSheet("color:rgb(255, 25, 28)")
        self.pushButton_RE.setObjectName("pushButton_RE")
        self.gridLayout.addWidget(self.pushButton_RE, 0, 0, 1, 1)
        self.pushButton_mul = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_mul.sizePolicy().hasHeightForWidth())
        self.pushButton_mul.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_mul.setFont(font)
        self.pushButton_mul.setObjectName("pushButton_mul")
        self.gridLayout.addWidget(self.pushButton_mul, 1, 3, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_4.sizePolicy().hasHeightForWidth())
        self.pushButton_4.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_4.setFont(font)
        self.pushButton_4.setStyleSheet("color: rgb(85, 170, 255);")
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout.addWidget(self.pushButton_4, 2, 0, 1, 1)
        self.pushButton_div = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_div.sizePolicy().hasHeightForWidth())
        self.pushButton_div.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_div.setFont(font)
        self.pushButton_div.setObjectName("pushButton_div")
        self.gridLayout.addWidget(self.pushButton_div, 0, 3, 1, 1)
        self.pushButton_MR = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_MR.sizePolicy().hasHeightForWidth())
        self.pushButton_MR.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_MR.setFont(font)
        self.pushButton_MR.setStyleSheet("color: rgb(85, 170, 255);\n"
"color: rgb(170, 85, 0);")
        self.pushButton_MR.setObjectName("pushButton_MR")
        self.gridLayout.addWidget(self.pushButton_MR, 0, 2, 1, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_2.sizePolicy().hasHeightForWidth())
        self.pushButton_2.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setStyleSheet("color: rgb(85, 170, 255);")
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 4, 1, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(self.gridLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_3.sizePolicy().hasHeightForWidth())
        self.pushButton_3.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.pushButton_3.setFont(font)
        self.pushButton_3.setStyleSheet("color: rgb(85, 170, 255);")
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout.addWidget(self.pushButton_3, 4, 2, 1, 1)
        self.lcdNumber = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber.setGeometry(QtCore.QRect(0, 0, 781, 51))
        self.lcdNumber.setDigitCount(28)
        self.lcdNumber.setObjectName("lcdNumber")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 783, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_eq.setText(_translate("MainWindow", "="))
        self.pushButton_add.setText(_translate("MainWindow", "+"))
        self.pushButton_7.setText(_translate("MainWindow", "7"))
        self.pushButton_sub.setText(_translate("MainWindow", "-"))
        self.pushButton_0.setText(_translate("MainWindow", "0"))
        self.pushButton_perc.setText(_translate("MainWindow", "/100"))
        self.pushButton_1.setText(_translate("MainWindow", "1"))
        self.pushButton_8.setText(_translate("MainWindow", "8"))
        self.pushButton_9.setText(_translate("MainWindow", "9"))
        self.pushButton_M.setText(_translate("MainWindow", "M"))
        self.pushButton_5.setText(_translate("MainWindow", "5"))
        self.pushButton_6.setText(_translate("MainWindow", "6"))
        self.pushButton_RE.setText(_translate("MainWindow", "RE"))
        self.pushButton_mul.setText(_translate("MainWindow", "*"))
        self.pushButton_4.setText(_translate("MainWindow", "4"))
        self.pushButton_div.setText(_translate("MainWindow", "/"))
        self.pushButton_MR.setText(_translate("MainWindow", "MR"))
        self.pushButton_2.setText(_translate("MainWindow", "2"))
        self.pushButton_3.setText(_translate("MainWindow", "3"))

logic.py

from PyQt5 import QtWidgets

class CalState:
    READY = 0 #ready
    INPUT = 1 #input

class CalLogic:
    def __init__(self,lcd_widget:QtWidgets.QLCDNumber):
        self.lcd_widget = lcd_widget

        self.state = None
        self.stack = None #list

        self.last_opration = None
        self.current_oprator = None

        self.memory = None

    def init_cal(self):
        """初始化计算机的状态"""
        self.state = CalState.READY
        self.stack = [0]
        self.last_opration = None
        self.current_oprator = None

        self._display()

    def _display(self):
        """计算机数字显示屏的显示"""
        self.lcd_widget.display(self.stack[-1])

    def number_slot(self,num_val):
        """数字0-9的槽函数"""
        if self.state == CalState.READY:
            self.stack[-1] = num_val
            self.state = CalState.INPUT
        else:
            self.stack[-1] = self.stack[-1] * 10 + num_val
        self._display()

    def opration_slot(self,oper):
        """实现计算器+-*/四个按键的槽函数"""
        self.current_oprator = oper
        self.state = CalState.INPUT
        self.stack.append(0) #stack列表中就有2个元素[0,0]

    def perc_slot(self):
        """实现1/100按键的槽函数"""
        self.stack[-1] *= 0.01
        self._display()
        self.state = CalState.INPUT

    def eq_slot(self):
        if self.current_oprator: # 我们这个case中,+
            try:
                result = self._do_oprator(self.stack[0],self.stack[1])
            except Exception:
                self.lcd_widget.display("error")
                self.stack = [0]
                return
            self.stack = [result]
            self.current_oprator = None
            self.state = CalState.READY
            self._display() #self.statck[3]

    def _do_oprator(self,oprand1,oprand2):
        """执行加减乘除操作逻辑"""
        if self.current_oprator == "+":
            result = oprand1 + oprand2
        elif self.current_oprator == "-":
            result = oprand1 - oprand2
        elif self.current_oprator == "*":
            result = oprand1 * oprand2
        else:
            result = oprand1 / oprand2
        return result

    def re_slot(self):
        self.init_cal()

    def m_slot(self):
        self.memory = self.lcd_widget.value()

    def mr_slot(self):
        self.stack[-1] = self.memory
        self.state = CalState.INPUT

        self._display()












main.py

from PyQt5.QtWidgets import *
from 计算器设计 import Ui_MainWindow
from logic import CalLogic
class MyMainWindows(QMainWindow,Ui_MainWindow):
    def __init__(self,*args,**kwargs):
        super(MyMainWindows,self).__init__(*args,**kwargs)
        self.setupUi(self)
        self.cl = CalLogic(self.lcdNumber)
        self.do_signal_slot()
        self.cl.init_cal()

    def do_signal_slot(self):
        "给数字0至9建立clicked信号和槽函数"
        self.pushButton_0.clicked.connect(lambda:self.cl.number_slot(0))
        self.pushButton_1.clicked.connect(lambda:self.cl.number_slot(1))
        self.pushButton_2.clicked.connect(lambda:self.cl.number_slot(2))
        self.pushButton_3.clicked.connect(lambda:self.cl.number_slot(3))
        self.pushButton_4.clicked.connect(lambda:self.cl.number_slot(4))
        self.pushButton_5.clicked.connect(lambda:self.cl.number_slot(5))
        self.pushButton_6.clicked.connect(lambda:self.cl.number_slot(6))
        self.pushButton_7.clicked.connect(lambda:self.cl.number_slot(7))
        self.pushButton_8.clicked.connect(lambda:self.cl.number_slot(8))
        self.pushButton_9.clicked.connect(lambda:self.cl.number_slot(9))

        """RE,M,MR"""
        self.pushButton_RE.clicked.connect(self.cl.re_slot)
        self.pushButton_RE.clicked.connect(self.cl.m_slot)
        self.pushButton_RE.clicked.connect(self.cl.mr_slot)

        """="""
        self.pushButton_eq.clicked.connect(self.cl.eq_slot)


        """给+-*/建立clicked信号和槽函数"""
        self.pushButton_add.clicked.connect(lambda :self.cl.opration_slot("+"))
        self.pushButton_sub.clicked.connect(lambda :self.cl.opration_slot("-"))
        self.pushButton_mul.clicked.connect(lambda :self.cl.opration_slot("*"))
        self.pushButton_div.clicked.connect(lambda :self.cl.opration_slot("/"))

        """1/100按键建立"""
        self.pushButton_perc.clicked.connect(self.cl.perc_slot)

if __name__ == "__main__":
    app = QApplication([])

    windows = MyMainWindows()
    windows.setWindowTitle("小丁")
    windows.show()
    app.exec_()

最终的效果

在这里插入图片描述

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

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

相关文章

python学习随笔3

range的使用 range()在python很常用&#xff0c;可以进行初始化和遍历等。 # range(st,ed) # [st, ed)# range(st,ed,step) # range(st, ed, step) i,i step, i 2 * step ... () < ed切片 跟range类似。 ll[st:ed:step]容器 元组 python中的元组中内容不可以进行更…

浅谈C++|运算符重载

重载原因 C 中的运算符重载是一种特性&#xff0c;允许程序员定义自定义类类型的运算符操作。通过运算符重载&#xff0c;可以对类对象执行类似于内置类型的操作&#xff0c;例如加法、减法、乘法等。 运算符重载通过定义特定的成员函数或非成员函数来实现。成员函数的运算符重…

html怎么设置按钮返回顶部

在 HTML 中&#xff0c;我们可以通过一些代码和 CSS 样式来创建一个这样的按钮。 <button onclick"topFunction()" id"myBtn">返回顶部</button> <style> #myBtn { display: none; position: fixed; bottom: 20px; right: 30px; z-inde…

高性能 Python 编译器 -- Codon

众所周知&#xff0c;Python 是一门简单易学、具有强大功能的编程语言&#xff0c;在各种用户使用统计榜单中总是名列前茅。相应地&#xff0c;围绕 Python&#xff0c;研究者开发了各种便捷工具&#xff0c;以更好的服务于这门语言。 编译器充当着高级语言与机器之间的翻译官&…

一封来自江苏省电力设计院的表扬信

近日&#xff0c;中新赛克海睿思收到了一封来自江苏省电力设计院公司&#xff08;以下简称“江苏院”&#xff09;的表扬信。 海睿思与江苏院自达成合作以来&#xff0c;双方团队经过共同努力&#xff0c;克服了项目交付过程中的诸多困难。不仅通过数据工程的整体咨询帮助江苏院…

pt26django教程

admin 后台数据库管理 django 提供了比较完善的后台管理数据库的接口&#xff0c;可供开发过程中调用和测试使用 django 会搜集所有已注册的模型类&#xff0c;为这些模型类提拱数据管理界面&#xff0c;供开发者使用 创建后台管理帐号: [rootvm mysite2]# python3 manage.…

什么是函数重载?作用是什么?如何使用?

函数重载是指在同一个作用域内&#xff0c;允许存在多个同名函数&#xff0c;但这些函数的参数列表必须不同。根据传入的参数类型、数量或顺序的不同&#xff0c;编译器可以区分调用哪个函数。 函数重载的作用主要有以下几点&#xff1a; 提高代码的可读性和可维护性&#xff…

openlayers-17-卷帘对比

实现卷帘对比功能&#xff0c;没有进一步测试版本兼容问题&#xff0c;不错从ol的官网来看&#xff0c;ol6之前的版本的示例与ol6及其之后的版本示例并不相同 ol5 示例https://openlayers.org/en/v5.3.0/examples/layer-swipe.html?qlayerswipeol6示例 https://openlayers.org…

GIS跟踪监管系统

GIS跟踪监管系统 系统架构功能模块1. 基本功能2. 仓库管理3. 物资查询 系统采用B/S架构&#xff0c;前端使用的技术为HTMLCSSJavaScript&#xff08;Leaflet、jQuery、bootstrap等&#xff09;&#xff0c;后台采用.NET框架。 系统架构 救援物资跟踪监管系统的架构如图所示&am…

Matplotlib入门

基本使用 基本用法 import matplotlib.pyplot as plt import numpy as npxnp.linspace(-1,1,50) y2*x1plt.figure()#定义一个图像窗口 plt.plot(x,y)#画&#xff08;x&#xff0c;y&#xff09;曲线 plt.show()#显示图像figure图像 import matplotlib.pyplot as plt import …

nat的基础配置(动态nat,nat server)

目录 1.静态nat 2.动态nat &#xff08;1&#xff09;配置公网地址池 &#xff08;2&#xff09;配置acl&#xff0c;匹配做nat转换的源 &#xff08;3&#xff09;将源转换为公网地址&#xff0c;其中no-pat表示不做端口转化&#xff0c;只做一对一的地址转换 3.nat ser…

《向量数据库指南》——向量数据库Milvus Cloud为什么选择开源?

开源对我们来说是一种信仰。从最早开始研发向量数据库的时候&#xff0c;我们就相信应该让更多人了解并使用优秀的技术&#xff0c;这是我们选择做开源的原因。 无论是在 AI 领域还是其他领域&#xff0c;我们希望技术不会被少数大公司垄断。在向量数据库问世之前&#xff0c;阿…

python:优化一EXCEL统计用类封装一下

# encoding: utf-8 # 版权所有 2023 涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 311 # Datetime : 2023/9/17 5:40 # User : geovindu # Product : PyCharm # Proj…

JSON和全局异常处理

目录 1️⃣JSON 一、什么是json&#xff1f; 二、与javascript的关系 三、语法格式 四、注意事项 五、总结 六&#xff0c;使用json 1导入pom.xml依赖 2.配置spring-mvc.xml 3. ResponseBody注解使用 创建一个web层控制器 编写ClazzBiz 实现接口 测试&#xff1a; …

C#,数值计算——Hashfn2的计算方法与源程序

1 文本格式 using System; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Hashfn2 { private static ulong[] hashfn_tab { get; set; } new ulong[256]; private ulong h { get; set;…

【2023年11月第四版教材】第13章《资源管理》(第三部分)

第13章《资源管理》&#xff08;第部分&#xff09; 4 管理过程4.1 数据表现★★★4.2 资源管理计划★★★4.2 团队章程★★★ 5 估算活动资源 4 管理过程 组过程输入工具和技术输出规划1.规划资源管理1.项目章程2.项目管理计划&#xff08;质量管理计划、范围基准&#xff09…

elasticsearch5-RestAPI操作

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

Python 布尔类型和比较运算符

视频版教程 Python3零基础7天入门实战视频教程 布尔( bool&#xff09;表达现实生活中的逻辑&#xff0c;即真和假&#xff0c;True表示真&#xff0c;False表示假。 实例&#xff1a; # 布尔类型定义 b1 True b2 False print(f"b1{b1},类型是{type(b1)}") prin…

分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现WOA-CNN-LSTM-Attention数据分类预测&#xff0c;运行环境Matlab2021b及以…

Vue3+Ts+Vite项目(第十五篇)——tailwindcss安装及使用详解,css原子化如何实现

文章目录 一、装包二、初始化2.1 终端执行如下命令2.2 postcss.config.js 文件中2.3 tailwind.config.js 文件中 三、样式文件3.1 新建 tailwind.css 文件3.2 main.ts 中引入 四、使用4.1 写入类名即可4.2 简单讲解 五、插件5.1 安装 Tailwind CSS IntelliSense5.2 使用效果 六…