使用PyQt(Python+Qt)+动态编译36行代码实现的计算器

Python Qt GUI快速编程-第四章的计算器python3+pytq5+Qt Designer实现 本代码为本人通过python3+pytq5+Qt desinger实现Python Qt GUI快速编程-第四章的计算器功能,还在原有例子上增加了两个按钮,请大家参考。 阅读详情

PyQt是基于跨平台的图形界面C++开发工具Qt加Python包装的一个GPL软件(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译),Qt基于Qt Designer提供了图形设计界面,通过绘制的图形界面使用PyUIC可以将图形界面转成Python代码文件(具体步骤请参考《第15.6节 PyQt5安装与配置》),这样图形界面设计和处理逻辑分离,可以快速实现应用。

本文解释的计算器由Qt Designer完成界面设计,并将鼠标点击事件与槽函数关联以响应界面输入,最后使用Python动态编译的eval函数实现表达式结果的计算,除了图形界面转换的代码外,其他处理代码只有36行,但计算器的功能还比较齐全。详细步骤如下:

一、设计计算器界面
在Qt Designer中设计计算器的图形界面,如下:
在这里插入图片描述
界面文件保存到Ui_Calculator.ui文件中。

二、定义按键与响应函数的关联
在Qt Designer中通过F4进入事件与槽函数的编辑界面,将按键与槽函数建立映射关系,以使得按键后调用对应槽函数进行响应,本次在主程序中设计了三个槽函数,分别为:
1、CalObjPressed响应所有数字、括号、计算符的鼠标点击;
2、ClearInput响应Clear按键的鼠标点击;
3、ExecuteCalculate:响应等号按键的鼠标点击。

三、将UI转换成Py代码
调用《第15.6节 PyQt5安装与配置》介绍的PyUIC,将UI图形界面代码转换成py代码(这部分不含在36行代码内)。如图:
在这里插入图片描述
转换后的文件为Ui_Calculator.py。

四、建立主程序calculator.py
在PyCharm中新建工程calculator,同时新建一个工程名同名的calculator.py作为应用主程序。在主程序中实现如下内容:
1、导入PyQt相关库和sys库

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import  QPushButton

2、导入Ui界面生成的py模块

from ui_Calculator import Ui_CaculatorWin

3、从Ui自动生成类派生出应用程序主窗口类w_Calculator并在构造函数中完成初始化

class w_Calculator(QtWidgets.QWidget, Ui_CaculatorWin):
    def __init__(self):
        super(w_Calculator, self).__init__()
        self.setupUi(self)
        self.expr = ''
        self.resultfinished = False

注意:上面的构造函数前2行代码是标准代码,是所有Ui类派生类都要有的。后面初始化了两个实例变量,其中expr 保存输入表达式,resultfinished 表示表达式计算完成。

4、在w_Calculator实习三个槽函数代码
1>、CalObjPressed
该函数响应等号按键,当按下等号键时,对显示界面的表达式调用动态编译函数eval进行计算,代码如下:

    def CalObjPressed(self):
        if  self.resultfinished:self.ClearInput()
        pButton = self.sender()
        char = pButton.text()
        self.CalculatorDisplay.insertPlainText(char)
        self.expr += char

2>、ClearInput(self)
该函数响应界面上的Clear按键,清除输入的表达式,代码如下:

    def ClearInput(self):
        self.CalculatorDisplay.clear()
        self.expr = ''
        self.resultfinished = False

3>ExecuteCalculate
响应等号按键进行表达式计算,代码如下:

    def ExecuteCalculate(self):
        self.CalculatorDisplay.append("=")
        globalArea = {}
        try: result = eval(self.expr, globalArea)
        except Exception as e:
            self.CalculatorDisplay.append(f"计算结果错误,错误原因:\n{e}")
        else: self.CalculatorDisplay.append(str(result))
        self.resultfinished = True

5、完成主程序的应用代码

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    # mainwin = MediaPlayerWin()
    # mainwin.show()
    W = w_Calculator()
    W.show()
    sys.exit(app.exec_())

这样一个完整的计算器程序就完成了,真正需要自己完成的代码就36行。

下面是运行效果截图:
在这里插入图片描述

附件1、完整主程序代码

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import  QPushButton
from ui_Calculator import Ui_CaculatorWin
class w_Calculator(QtWidgets.QWidget, Ui_CaculatorWin):
    def __init__(self):
        super(w_Calculator, self).__init__()
        self.setupUi(self)
        self.expr = ''
        self.resultfinished = False
    def CalObjPressed(self):
        if  self.resultfinished:self.ClearInput()
        pButton = self.sender()
        char = pButton.text()
        self.CalculatorDisplay.insertPlainText(char)
        self.expr += char
    def ExecuteCalculate(self):
        self.CalculatorDisplay.append("=")
        globalArea = {}
        try: result = eval(self.expr, globalArea)
        except Exception as e:
            self.CalculatorDisplay.append(f"计算结果错误,错误原因:\n{e}")
        else: self.CalculatorDisplay.append(str(result))
        self.resultfinished = True
    def ClearInput(self):
        self.CalculatorDisplay.clear()
        self.expr = ''
        self.resultfinished = False

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    # mainwin = MediaPlayerWin()
    # mainwin.show()
    W = w_Calculator()
    W.show()
    sys.exit(app.exec_())

2、UI文件ui_Calculator.ui的内容

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>CaculatorWin</class>
 <widget class="QWidget" name="CaculatorWin">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>339</width>
    <height>314</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>计算器</string>
  </property>
  <property name="windowIcon">
   <iconset>
    <normaloff>C:/Users/jwp/资源/cal.jpg</normaloff>C:/Users/jwp/资源/cal.jpg</iconset>
  </property>
  <widget class="QWidget" name="gridLayoutWidget">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>140</y>
     <width>320</width>
     <height>170</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="2" column="3">
     <widget class="QPushButton" name="pushButton_dot">
      <property name="text">
       <string>.</string>
      </property>
     </widget>
    </item>
    <item row="0" column="2">
     <widget class="QPushButton" name="pushButton_Multiply">
      <property name="text">
       <string>*</string>
      </property>
     </widget>
    </item>
    <item row="6" column="0">
     <widget class="QPushButton" name="pushButton0">
      <property name="text">
       <string>0</string>
      </property>
     </widget>
    </item>
    <item row="0" column="3">
     <widget class="QPushButton" name="pushButton_div">
      <property name="text">
       <string>/</string>
      </property>
     </widget>
    </item>
    <item row="6" column="1">
     <widget class="QPushButton" name="pushButton_leftbrackets">
      <property name="text">
       <string>(</string>
      </property>
     </widget>
    </item>
    <item row="3" column="1">
     <widget class="QPushButton" name="pushButton5">
      <property name="text">
       <string>5</string>
      </property>
     </widget>
    </item>
    <item row="3" column="3">
     <widget class="QPushButton" name="pushButton_mod">
      <property name="text">
       <string>%</string>
      </property>
     </widget>
    </item>
    <item row="2" column="2">
     <widget class="QPushButton" name="pushButton3">
      <property name="text">
       <string>3</string>
      </property>
     </widget>
    </item>
    <item row="0" column="0">
     <widget class="QPushButton" name="pushButton_Add">
      <property name="text">
       <string>+</string>
      </property>
     </widget>
    </item>
    <item row="2" column="0">
     <widget class="QPushButton" name="pushButton1">
      <property name="text">
       <string>1</string>
      </property>
     </widget>
    </item>
    <item row="4" column="2">
     <widget class="QPushButton" name="pushButton9">
      <property name="text">
       <string>9</string>
      </property>
     </widget>
    </item>
    <item row="4" column="1">
     <widget class="QPushButton" name="pushButton8">
      <property name="text">
       <string>8</string>
      </property>
     </widget>
    </item>
    <item row="6" column="2">
     <widget class="QPushButton" name="pushButton_rightbrackets">
      <property name="text">
       <string>)</string>
      </property>
     </widget>
    </item>
    <item row="3" column="2">
     <widget class="QPushButton" name="pushButton6">
      <property name="text">
       <string>6</string>
      </property>
     </widget>
    </item>
    <item row="3" column="0">
     <widget class="QPushButton" name="pushButton4">
      <property name="text">
       <string>4</string>
      </property>
     </widget>
    </item>
    <item row="2" column="1">
     <widget class="QPushButton" name="pushButton2">
      <property name="text">
       <string>2</string>
      </property>
     </widget>
    </item>
    <item row="0" column="1">
     <widget class="QPushButton" name="pushButton_Minus">
      <property name="text">
       <string>-</string>
      </property>
     </widget>
    </item>
    <item row="4" column="0">
     <widget class="QPushButton" name="pushButton7">
      <property name="text">
       <string>7</string>
      </property>
     </widget>
    </item>
    <item row="6" column="3">
     <widget class="QPushButton" name="pushButton_Cal">
      <property name="text">
       <string>=</string>
      </property>
     </widget>
    </item>
    <item row="4" column="3">
     <widget class="QPushButton" name="pushButton_Clear">
      <property name="text">
       <string>Clear</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QTextBrowser" name="CalculatorDisplay">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>321</width>
     <height>121</height>
    </rect>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>pushButton_Add</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>55</x>
     <y>160</y>
    </hint>
    <hint type="destinationlabel">
     <x>3</x>
     <y>113</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_Minus</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>115</x>
     <y>159</y>
    </hint>
    <hint type="destinationlabel">
     <x>3</x>
     <y>139</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_Multiply</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>204</x>
     <y>156</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>128</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_div</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>277</x>
     <y>155</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>98</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton1</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>72</x>
     <y>189</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>157</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton2</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>137</x>
     <y>187</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>163</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton3</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>222</x>
     <y>184</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>84</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_dot</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>301</x>
     <y>184</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>57</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton4</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>38</x>
     <y>219</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>40</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton5</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>110</x>
     <y>221</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>29</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton6</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>194</x>
     <y>221</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>22</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_mod</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>269</x>
     <y>223</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>8</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton7</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>60</x>
     <y>255</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>192</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton8</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>129</x>
     <y>252</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>219</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton9</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>226</x>
     <y>252</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>244</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton0</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>37</x>
     <y>287</y>
    </hint>
    <hint type="destinationlabel">
     <x>29</x>
     <y>313</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_leftbrackets</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>104</x>
     <y>289</y>
    </hint>
    <hint type="destinationlabel">
     <x>98</x>
     <y>313</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_rightbrackets</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>CalObjPressed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>194</x>
     <y>292</y>
    </hint>
    <hint type="destinationlabel">
     <x>190</x>
     <y>313</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_Cal</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>ExecuteCalculate()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>279</x>
     <y>288</y>
    </hint>
    <hint type="destinationlabel">
     <x>277</x>
     <y>313</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_Clear</sender>
   <signal>clicked()</signal>
   <receiver>CaculatorWin</receiver>
   <slot>ClearInput()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>306</x>
     <y>257</y>
    </hint>
    <hint type="destinationlabel">
     <x>336</x>
     <y>304</y>
    </hint>
   </hints>
  </connection>
 </connections>
 <slots>
  <slot>digitPressed()</slot>
  <slot>digitPressed(digit)</slot>
  <slot>CalObjPressed()</slot>
  <slot>ExecuteCalculate()</slot>
  <slot>ClearInput()</slot>
 </slots>
</ui>

附件3、Ui转换的ui_Calculator.py文件内容

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

# Form implementation generated from reading ui file 'ui_Calculator.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_CaculatorWin(object):
    def setupUi(self, CaculatorWin):
        CaculatorWin.setObjectName("CaculatorWin")
        CaculatorWin.resize(339, 314)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("C:/Users/jwp/资源/cal.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        CaculatorWin.setWindowIcon(icon)
        self.gridLayoutWidget = QtWidgets.QWidget(CaculatorWin)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 140, 320, 170))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.pushButton_dot = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton_dot.setObjectName("pushButton_dot")
        self.gridLayout_2.addWidget(self.pushButton_dot, 2, 3, 1, 1)
        self.pushButton_Multiply = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton_Multiply.setObjectName("pushButton_Multiply")
        self.gridLayout_2.addWidget(self.pushButton_Multiply, 0, 2, 1, 1)
        self.pushButton0 = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton0.setObjectName("pushButton0")
        self.gridLayout_2.addWidget(self.pushButton0, 6, 0, 1, 1)
        self.pushButton_div = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton_div.setObjectName("pushButton_div")
        self.gridLayout_2.addWidget(self.pushButton_div, 0, 3, 1, 1)
        self.pushButton_leftbrackets = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton_leftbrackets.setObjectName("pushButton_leftbrackets")
        self.gridLayout_2.addWidget(self.pushButton_leftbrackets, 6, 1, 1, 1)
        self.pushButton5 = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton5.setObjectName("pushButton5")
        self.gridLayout_2.addWidget(self.pushButton5, 3, 1, 1, 1)
        self.pushButton_mod = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton_mod.setObjectName("pushButton_mod")
        self.gridLayout_2.addWidget(self.pushButton_mod, 3, 3, 1, 1)
        self.pushButton3 = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton3.setObjectName("pushButton3")
        self.gridLayout_2.addWidget(self.pushButton3, 2, 2, 1, 1)
        self.pushButton_Add = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton_Add.setObjectName("pushButton_Add")
        self.gridLayout_2.addWidget(self.pushButton_Add, 0, 0, 1, 1)
        self.pushButton1 = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton1.setObjectName("pushButton1")
        self.gridLayout_2.addWidget(self.pushButton1, 2, 0, 1, 1)
        self.pushButton9 = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton9.setObjectName("pushButton9")
        self.gridLayout_2.addWidget(self.pushButton9, 4, 2, 1, 1)
        self.pushButton8 = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton8.setObjectName("pushButton8")
        self.gridLayout_2.addWidget(self.pushButton8, 4, 1, 1, 1)
        self.pushButton_rightbrackets = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton_rightbrackets.setObjectName("pushButton_rightbrackets")
        self.gridLayout_2.addWidget(self.pushButton_rightbrackets, 6, 2, 1, 1)
        self.pushButton6 = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton6.setObjectName("pushButton6")
        self.gridLayout_2.addWidget(self.pushButton6, 3, 2, 1, 1)
        self.pushButton4 = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton4.setObjectName("pushButton4")
        self.gridLayout_2.addWidget(self.pushButton4, 3, 0, 1, 1)
        self.pushButton2 = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton2.setObjectName("pushButton2")
        self.gridLayout_2.addWidget(self.pushButton2, 2, 1, 1, 1)
        self.pushButton_Minus = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton_Minus.setObjectName("pushButton_Minus")
        self.gridLayout_2.addWidget(self.pushButton_Minus, 0, 1, 1, 1)
        self.pushButton7 = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton7.setObjectName("pushButton7")
        self.gridLayout_2.addWidget(self.pushButton7, 4, 0, 1, 1)
        self.pushButton_Cal = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton_Cal.setObjectName("pushButton_Cal")
        self.gridLayout_2.addWidget(self.pushButton_Cal, 6, 3, 1, 1)
        self.pushButton_Clear = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.pushButton_Clear.setObjectName("pushButton_Clear")
        self.gridLayout_2.addWidget(self.pushButton_Clear, 4, 3, 1, 1)
        self.CalculatorDisplay = QtWidgets.QTextBrowser(CaculatorWin)
        self.CalculatorDisplay.setGeometry(QtCore.QRect(10, 10, 321, 121))
        self.CalculatorDisplay.setObjectName("CalculatorDisplay")

        self.retranslateUi(CaculatorWin)
        self.pushButton_Add.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton_Minus.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton_Multiply.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton_div.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton1.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton2.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton3.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton_dot.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton4.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton5.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton6.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton_mod.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton7.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton8.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton9.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton0.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton_leftbrackets.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton_rightbrackets.clicked.connect(CaculatorWin.CalObjPressed)
        self.pushButton_Cal.clicked.connect(CaculatorWin.ExecuteCalculate)
        self.pushButton_Clear.clicked.connect(CaculatorWin.ClearInput)
        QtCore.QMetaObject.connectSlotsByName(CaculatorWin)

    def retranslateUi(self, CaculatorWin):
        _translate = QtCore.QCoreApplication.translate
        CaculatorWin.setWindowTitle(_translate("CaculatorWin", "计算器"))
        self.pushButton_dot.setText(_translate("CaculatorWin", "."))
        self.pushButton_Multiply.setText(_translate("CaculatorWin", "*"))
        self.pushButton0.setText(_translate("CaculatorWin", "0"))
        self.pushButton_div.setText(_translate("CaculatorWin", "/"))
        self.pushButton_leftbrackets.setText(_translate("CaculatorWin", "("))
        self.pushButton5.setText(_translate("CaculatorWin", "5"))
        self.pushButton_mod.setText(_translate("CaculatorWin", "%"))
        self.pushButton3.setText(_translate("CaculatorWin", "3"))
        self.pushButton_Add.setText(_translate("CaculatorWin", "+"))
        self.pushButton1.setText(_translate("CaculatorWin", "1"))
        self.pushButton9.setText(_translate("CaculatorWin", "9"))
        self.pushButton8.setText(_translate("CaculatorWin", "8"))
        self.pushButton_rightbrackets.setText(_translate("CaculatorWin", ")"))
        self.pushButton6.setText(_translate("CaculatorWin", "6"))
        self.pushButton4.setText(_translate("CaculatorWin", "4"))
        self.pushButton2.setText(_translate("CaculatorWin", "2"))
        self.pushButton_Minus.setText(_translate("CaculatorWin", "-"))
        self.pushButton7.setText(_translate("CaculatorWin", "7"))
        self.pushButton_Cal.setText(_translate("CaculatorWin", "="))
        self.pushButton_Clear.setText(_translate("CaculatorWin", "Clear"))

博客地址:https://blog.youkuaiyun.com/LaoYuanPython

老猿Python博客文章目录:https://blog.youkuaiyun.com/LaoYuanPython/article/details/98245036

第五章、信号和槽的实战应用--一个计算器的实现 老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 本文介绍的计算器按照《第二章、PyQt5应用构建详细过程介绍》和《第三章 使用Qt Designer进行GUI设计》的方法进行的一个PyQt开发的计算机应用程序,由Qt Designer完成界面设计,并将鼠标点击事件与槽函数关联以响应界面输入,最后使用Python动态编译的eval函数实现表达式... 阅读详情

相关推荐

从课堂笔记到动手实践:用Multisim仿真高频谐振功放(丙类)的完整流程

本文详细介绍了使用Multisim仿真高频谐振功放(丙类)的完整流程,从仿真环境准备到电路搭建、偏置网络设计、信号注入与波形观测,再到效率优化与性能验证。通过14个关键操作步骤,帮助读者将高频电子线路的理论知识转化为动手实践,深入理解丙类功放的非线性工作状态和效率优化技巧。

weixin_30701575的博客 520

使用Qt Designer和PyCharm Python3.7实现简易计算器 并打包成.exe文件

使用Qt Designer和PyCharm Python3.7实现简易计算器 一、使用Qt Designer设计UI界面 首先在pycharn上面添加pyqt框架,使用其qt designer工具,推荐安装博客: https://blog.youkuaiyun.com/mawei7510/article/details/81450032?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-3&spm

亮亮的博客 2386

【课程设计】TCP/IP 应用环境中服务器的部署与实现

本项目旨在通过搭建一个虚拟网络环境,实现软路由系统的配置和服务器的搭建与测试。具体包括安装虚拟机 VMWare Workstation,安装 Windows Server 2003 操作系统,配置软路由系统(包括双网卡安装、协议配置和测试),以及搭建并测试 DHCP 服务、DNS 服务、WWW 服务、FTP 服务和 SMTP/POP3 服务。

weixin_74907236的博客 1524

python使用pyqt5制作计算器

这两天看pyqt5了,这个模块可以用来制作桌面软件,自己试着做了个计算器,这里记录一下。 安装: pip install PyQt5 安装完成继续安装PyQt5-tools pip install PyQt5-tools 然后配置pycharm 点击:File -》Settings-》Tools -》 External Tools -》点击“+”号 我的配置过了,所以下面显示的有Qt Desi...

李孟笛的博客 8235

从内外参推导IPM变换方程及代码实现(生成AVM环视拼接图)

最近想实现AVM拼接,看了不少博客和论文,不过比较愚钝,一直没能很好理解原理,尤其是怎么在实现时把下文中Z1和Z2消除的,所以严谨的推导了一下对应的公式,如有不对,水平有限,烦请指出~IPM变换(逆透视变换),顾名思义,即将正常透视效应消除的变换,变换结果为鸟瞰图BEV(俯视图);AVM环视拼接一般是将车身前后左右的四个鱼眼相机拼接成环视图(也是俯视),其使用的单应矩阵将四个相机转到同一个俯视坐标系。

mxdsdo09的博客 4173

避坑指南:ANSYS流固耦合计算中System Coupling数据传递设置与常见报错解决

本文深入解析ANSYS Workbench中System Coupling模块在双向流固耦合(FSI)计算中的应用,详细讲解数据传递机制、典型报错解决方案及高阶调试技巧。通过实际案例展示如何优化耦合步长、处理大变形问题,并提升并行计算效率,帮助工程师有效规避常见技术陷阱。

weixin_29213525的博客 728

PyQt6案例3:简单计算器案例

通过PyQt6小案例简单计算器的演练,说明PyQt6的简单应用,希望对初学者有一定的帮助!

Truthwave的博客 1664

Ovito隐藏技巧:用Expression Selection快速提取分子链(附模糊背景配置参数)

本文详细介绍了Ovito软件中Expression Selection功能的隐藏技巧,用于从复杂的分子动力学模拟数据中快速、精准地提取目标分子链。通过结合Expand Selection和Invert Selection等修饰器,形成一套高效的工作流,并深入解析了实现SCI论文级渲染效果的景深模糊参数配置,帮助研究者大幅提升数据处理与图片生成效率。

pz890123的博客 867

使用PyQt5设计一款简单的计算器

采用了PyQt5模块和Python语言进行设计,实现较为简单,易于理解和修改。可以进行基本运算操作,包括加、减、乘、除等。功能较为简单,只能进行基础的数学运算,无任何高级功能。输入输出仅支持数字和基本的加减乘除运算符号,不支持其他字符、函数或变量。在除数为0时无法做出错误提示,故看起来好像可以除以0一样。综上所述,该计算器适合作为一个小型的实验项目或界面设计入门示例,但是并不够强大,不能满足更多复杂应用场景的需求。

星空下的仰望者 2330

3️⃣ Coze工作流基础教学(2025年全新版本)

Coze 工作流作为扣子平台的重磅工具,利用可视化节点,如大语言模型、插件、条件判断等,把复杂任务巧妙拆解成多步骤流程。它不仅支持自动化编排,还能实现跨系统协同,有效提升处理效率与输出稳定性。在那些对准确性或格式有严格要求的场景中,比如报告生成、旅行规划,Coze 工作流更是发挥着关键作用。

李同学Lino的博客 5855

科研级YOLO26下采样革新:ContextGuided模块赋能,让特征降维兼具上下文感知的实战指南

在文件夹下新建,将上述类的代码写入其中。这一步是为了让YOLO26的代码架构能识别我们的自定义下采样模块。

LXY_LOVE36的博客 101

python 动态编译代码_使用PyQt(Python+Qt)+动态编译36行代码实现的计算器

PyQt是基于跨平台的图形界面C++开发工具Qt加Python包装的一个GPL软件(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译),Qt基于Qt Designer提供了图形设计界面,通过绘制的图形界面使用PyUIC可以将图形界面转成Python代码文件(具体步骤请参考《第15.6节 PyQt5安装与配置》),这样图形界面设计和处理逻辑分离...

weixin_39742568的博客 515

【宝藏级】全网最全的Pandas详细教程(2万字总结)

【回炉重造】Python之Pandas详细教程前言为什么要学习pandas?什么是Pandas?官网1. Pandas的索引操作索引对象Index {#索引对象index}1. Series和DataFrame中的索引都是Index对象2. 索引对象不可变,保证了数据的安全常见的Index种类Series索引 {#series索引}1. index 指定行索引名2. 行索引3. 切片索引4. 不连续索引5. 布尔索引DataFrame索引1. columns 指定列索引名2. 列索引3. 不连续索引高级索引

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 6万+

Python+Pycharm+PyQT5可视化程序设计入门!

一个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架,像我之前常用的是自带的Tkinter,对于一些小功能不复杂的程序是绰绰有余的,但对于功能稍微复杂,还是希望找到更简便快捷的GUI设计框架。PyQt是QT的Python版本,现在最新的版本已经是PyQt5,是Python的GUI设计之中应用较为广泛的开发框架。本文将基于广泛应用的Pycharm,搭建PyQT5...

爬遍所有网站 1522

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c++可视化界面设计_专栏 | Python+Pycharm+PyQT5可视化程序设计入门

作者介绍mishaw高级工程师擅长领域:轮胎建模与仿真,模态轮胎生成,虚拟路谱的整车路躁仿真,CAE NVH前后处理程序开发,结构优化 ,整车建模,仿真精度提升 ,NVH问题解决。本文由作者首发于公众号:误入CAE的程序员文末有作者《轮胎建模仿真与模态轮胎的生成》以及150元优惠券。一个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架,像我之前常用的是自带...

weixin_39734020的博客 810

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pycharm可视化网页编程_Python+Pycharm+PyQT5可视化程序设计入门!

一个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架,像我之前常用的是自带的Tkinter,对于一些小功能不复杂的程序是绰绰有余的,但对于功能稍微复杂,还是希望找到更简便快捷的GUI设计框架。PyQt是QT的Python版本,现在最新的版本已经是PyQt5,是Python的GUI设计之中应用较为广泛的开发框架。本文将基于广泛应用的Pycharm,搭建PyQT5的开发...

weixin_39866774的博客 901

pycharm 修改运行框架_专栏 | Python+Pycharm+PyQT5可视化程序设计入门

作者介绍mishaw高级工程师擅长领域:轮胎建模与仿真,模态轮胎生成,虚拟路谱的整车路躁仿真,CAE NVH前后处理程序开发,结构优化 ,整车建模,仿真精度提升 ,NVH问题解决。本文由作者首发于公众号:误入CAE的程序员文末有作者《轮胎建模仿真与模态轮胎的生成》以及150元优惠券。一个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架,像我之前常用的是自带...

weixin_42134338的博客 318

pycharm可视化网页编程_Python+Pycharm+PyQT5可视化程序设计入门

个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架,像我之前常用的是自带的Tkinter,对于一些小功能不复杂的程序是绰绰有余的,但对于功能稍微复杂,还是希望找到更简便快捷的GUI设计框架。PyQt是QT的Python版本,现在最新的版本已经是PyQt5,是Python的GUI设计之中应用较为广泛的开发框架。本文将基于广泛应用的Pycharm,搭建PyQT5的开发环...

weixin_39913472的博客 663

pycharm 修改运行框架_Python+Pycharm+PyQT5可视化程序设计入门

一个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架,像我之前常用的是自带的Tkinter,对于一些小功能不复杂的程序是绰绰有余的,但对于功能稍微复杂,还是希望找到更简便快捷的GUI设计框架。PyQt是QT的Python版本,现在最新的版本已经是PyQt5,是Python的GUI设计之中应用较为广泛的开发框架。本文将基于广泛应用的Pycharm,搭建PyQ...

weixin_39788382的博客 113

c++可视化界面设计_Python+Pycharm+PyQT5可视化程序设计入门!

一个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架,像我之前常用的是自带的Tkinter,对于一些小功能不复杂的程序是绰绰有余的,但对于功能稍微复杂,还是希望找到更简便快捷的GUI设计框架。PyQt是QT的Python版本,现在最新的版本已经是PyQt5,是Python的GUI设计之中应用较为广泛的开发框架。本文将基于广泛应用的Pycharm,搭建PyQT5的开发...

weixin_39881167的博客 803

python界面设计模块_Python+Pycharm+PyQT5可视化程序设计入门

AD: 购买本站源码请联系QQ677123或右侧QQ在线。一个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架,像我之前常用的是自带的Tkinter,对于一些小功能不复杂的程序是绰绰有余的,但对于功能稍微复杂,还是希望找到更简便快捷的GUI设计框架。PyQt是QT的Python版本,现在最新的版本已经是PyQt5,是Python的GUI设计之中应用较为广泛的开发框架...

weixin_39649405的博客 544

python可视化界面编程 pycharm_Python+Pycharm+PyQT5可视化程序设计入门!

一个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架,像我之前常用的是自带的Tkinter,对于一些小功能不复杂的程序是绰绰有余的,但对于功能稍微复杂,还是希望找到更简便快捷的GUI设计框架。PyQt是QT的Python版本,现在最新的版本已经是PyQt5,是Python的GUI设计之中应用较为广泛的开发框架。本文将基于广泛应用的Pycharm,搭建PyQT5的开发...

weixin_39801165的博客 389

c++可视化界面设计_干货分享:Python+Pycharm+PyQT5可视化程序设计入门

一个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架,像我之前常用的是自带的Tkinter,对于一些小功能不复杂的程序是绰绰有余的,但对于功能稍微复杂,还是希望找到更简便快捷的GUI设计框架。PyQt是QT的Python版本,现在最新的版本已经是PyQt5,是Python的GUI设计之中应用较为广泛的开发框架。本文将基于广泛应用的Pycharm,搭建PyQ...

weixin_39629617的博客 422

python qt教程视频 下载_PyQt5开发与实战教程,视频教程下载

课程介绍:涵盖了Python语言的核心部分,包括Python环境安装和配置、Python基础知识、Python条件、循环,列表、元组、字典、字符串、函数、异常、类、对象、属性、静态方法、类方法、监控属性的变化、迭代器、生成器。正则表达式、Python常用模块。以及PyQt5的核心知识。课程目录:第一章:PyQt5基础知识1.PyQt5简介课件付费后下载2.搭建PyQt5开发环境3.开发第一个基于P...

weixin_39850920的博客 734
上一篇: PyQt(Python+Qt)学习随笔:Qt Designer组件属性编辑界面中对话窗QDialog的modal属性
下一篇: PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件的text属性
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值