python3.5 + PyQt5 +Eric6 实现的一个计算器代码


Posted in Python onMarch 11, 2017

目前可以实现简单的计算。计算前请重置,设计的时候默认数字是0,学了半天就做出来个这么个结果,bug不少。 python3.5 + PyQt5 +Eric6 在windows7 32位系统可以完美运行 计算器,简单学了半天就画个图实现的存在bug,部分按钮还未实现,后续优化。

代码结构如图:

python3.5 + PyQt5 +Eric6 实现的一个计算器代码 

jisuan.py

import re
#匹配整数或小数的乘除法,包括了开头存在减号的情况
mul_div=re.compile("(-?\d+)(\.\d+)?(\*|/)(-?\d+)(\.\d+)?")
#匹配整数或小数的加减法,包括了开头存在减号的情况
plus_minus = re.compile("(-?\d+)(\.\d+)?(-|\+)(-?\d+)(\.\d+)?")
#匹配括号
bracket=re.compile("\([^()]*\)")
#匹配乘法的时候出现乘以负数的情况,包括了开头存在减号的情况
mul_minus_minus = re.compile("(-?\d+)(\.\d+)?(\*-)(\d+)(\.\d+)?")
#匹配除法的时候出现乘以负数的情况,包括了开头存在减号的情况
div_minus_minus = re.compile("(-?\d+)(\.\d+)?(/-)(\d+)(\.\d+)?")
#定义一个两位数的加减乘除法的运算,匹配左边的右边的数字和左边的数字,然后进行计算
def touble_cale(str_expire):
  if str_expire.count("+") == 1:
    right_num = float(str_expire[(str_expire.find("+")+1):])
    left_num = float(str_expire[:str_expire.find("+")])
    return str(right_num+left_num)
  elif str_expire[1:].count("-") == 1:
    right_num = float(str_expire[:str_expire.find("-",1)])
    left_num = float(str_expire[(str_expire.find("-", 1) + 1):])
    return str(right_num - left_num)
  elif str_expire.count("*") == 1:
    right_num = float(str_expire[:str_expire.find("*")])
    left_num = float(str_expire[(str_expire.find("*")+1):])
    return str(right_num * left_num)
  elif str_expire.count("/") == 1:
    right_num = float(str_expire[:str_expire.find("/")])
    left_num = float(str_expire[(str_expire.find("/") + 1):])
    return str(right_num / left_num)


#定义一个方法用于判断是否存在乘以负数和除以负数的情况
def judge_mul_minus(str_expire):
  #判断公式中乘以负数的部分
  if len(re.findall("(\*-)", str_expire)) != 0:
    #调用上面的正则取得*-的公式
    temp_mul_minus = mul_minus_minus.search(str_expire).group()
    #将匹配的部分的*-换成*并将-放到前面
    temp_mul_minus_2 = temp_mul_minus.replace(temp_mul_minus,"-" + temp_mul_minus.replace("*-","*"))
    #经更改的的部分与原来的部分进行替换
    str_expire=str_expire.replace(temp_mul_minus,temp_mul_minus_2)
    return judge_mul_minus(str_expire)
    #return str_expire
  # 判断公式中除以负数的部分
  elif len(re.findall(r"(/-)", str_expire)) != 0:
    # 调用上面的正则取得/-的公式
    temp_dev_minus = div_minus_minus.search(str_expire).group()
    # 将匹配的部分的/-换成/并将-放到前面
    temp_dev_minus_2 = temp_dev_minus.replace(temp_dev_minus,"-" + temp_dev_minus.replace("/-","/"))
    # 经更改的的部分与原来的部分进行替换
    str_expire = str_expire.replace(temp_dev_minus,temp_dev_minus_2)
    return judge_mul_minus(str_expire)
  #调用change_sign将公式中的++换成= +-换成-
  return change_sign(str_expire)

#定义一个方法取将--更改为+ +-改为-
def change_sign(str_expire):
  if len(re.findall(r"(\+-)", str_expire)) != 0:
    str_expire = str_expire.replace("+-", "-")
    return change_sign(str_expire)
  elif len(re.findall(r"(--)", str_expire)) != 0:
    str_expire = str_expire.replace("--", "+")
    return change_sign(str_expire)
  return str_expire


#定义一个方法用于计算只有加减乘除的公式,优先处理乘法
def cale_mix(str_expire):
  #如果公式中出现符号数字的情况即+5 -6 *8 /8的这种情况直接放回数字否则则先计算乘除在处理加减
  while len(re.findall("[-+*/]",str_expire[1:])) != 0:
    if len(re.findall("(\*|/)",str_expire)) != 0:
      str_expire = str_expire.replace(mul_div.search(str_expire).group(),touble_cale(mul_div.search(str_expire).group()))
    elif len(re.findall("(\+|-)",str_expire)) !=0:
      str_expire = str_expire.replace(plus_minus.search(str_expire).group(),touble_cale(plus_minus.search(str_expire).group()))
  return str_expire

#定义一个方法用于去括号,并调用上述的方法进行计算
def remove_bracket(str_expire):
  #判断公式中是否有括号
  if len(bracket.findall(str_expire)) == 0:
    return cale_mix(judge_mul_minus(str_expire))
  elif len(bracket.findall(str_expire))!=0:
    while len(bracket.findall(str_expire)) !=0:
      #print(bracket.search(str_expire).group())
      #只有存在括号优先处理括号中的内容并对内容进行替换,直到没有括号位置
      str_expire = str_expire.replace(bracket.search(str_expire).group(),cale_mix(judge_mul_minus(bracket.search(str_expire).group()[1:-1])))
    str_expire = cale_mix(judge_mul_minus(str_expire))
    return str_expire
if __name__ == "__main__":
  while True:
    user_input_expire = input("请输入你的公式:(不要带空格,q表示退出):")
    print("%s=%s" %(user_input_expire,remove_bracket(user_input_expire)))
    continue

untitled.py

# -*- coding: utf-8 -*-
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets
from Ui_untitled import Ui_Dialog
from jisuan import remove_bracket
class Dialog(QDialog, Ui_Dialog):
  def __init__(self, parent=None):
    super(Dialog, self).__init__(parent)
    self.setupUi(self)
  @pyqtSlot()
  def on_Button_6_clicked(self):
    self.Edit_xianshi.insertPlainText('6')
  @pyqtSlot()
  def on_Button_2_clicked(self):
    self.Edit_xianshi.insertPlainText('2')
  @pyqtSlot()
  def on_Button_3_clicked(self):
    self.Edit_xianshi.insertPlainText('3')
  @pyqtSlot()
  def on_Button_pingfang_clicked(self):
    me=self.Edit_xianshi.toPlainText()
    m=int(me) *int(me)
    self.Edit_xianshi.clear()
    self.Edit_xianshi.append(str(m))
  @pyqtSlot()
  def on_Button_add_clicked(self):
    h=self.Edit_xianshi.toPlainText()
    self.Edit_xianshi.clear()
    self.Edit_xianshi.append(h+'+')
  @pyqtSlot()
  def on_Button_jian_clicked(self):
    h = self.Edit_xianshi.toPlainText()
    self.Edit_xianshi.clear()
    self.Edit_xianshi.append(h + '-')
  @pyqtSlot()
  def on_Button_9_clicked(self):
    self.Edit_xianshi.insertPlainText('9')
  @pyqtSlot()
  def on_Button_chu_clicked(self):
    h = self.Edit_xianshi.toPlainText()
    self.Edit_xianshi.clear()
    self.Edit_xianshi.append(h + '/')
  @pyqtSlot()
  def on_Button_cheng_clicked(self):
    h = self.Edit_xianshi.toPlainText()
    self.Edit_xianshi.clear()
    self.Edit_xianshi.append(h + '*')
  @pyqtSlot()
  def on_Button_8_clicked(self):
    self.Edit_xianshi.insertPlainText('8')
  @pyqtSlot()
  def on_Button_4_clicked(self):
    self.Edit_xianshi.insertPlainText('4')
  @pyqtSlot()
  def on_Button_esc_clicked(self):
    self.Edit_xianshi.clear()
  @pyqtSlot()
  def on_Button_7_clicked(self):
    self.Edit_xianshi.insertPlainText('7')
  @pyqtSlot()
  def on_Button_1_clicked(self):
    self.Edit_xianshi.insertPlainText('1')
  @pyqtSlot()
  def on_Button_5_clicked(self):
    self.Edit_xianshi.insertPlainText('5')
  @pyqtSlot()
  def on_Button_xiaoshu_clicked(self):
    self.Edit_xianshi.insertPlainText('.')
  @pyqtSlot()
  def on_Button_0_clicked(self):
    self.Edit_xianshi.insertPlainText('0')
  @pyqtSlot()
  def on_Button_dengyu_clicked(self):
    pe=self.Edit_xianshi.toPlainText()
    m=remove_bracket(pe)
    self.Edit_xianshi.clear()
    self.Edit_xianshi.append(str(m))

  def on_Button_fenzhi_clicked(self):
    pe = self.Edit_xianshi.toPlainText()
    if int(pe) ==0:
      QMessageBox.information(self,u'提示',u'零不能作为分母')
      Dialog()
    else:
      m=1/(int(pe))
      self.Edit_xianshi.clear()
      self.Edit_xianshi.append(str(m))
      Dialog()
if __name__ =="__main__":
  import sys
  app = QtWidgets.QApplication(sys.argv)
  app.processEvents()
  ui = Dialog()
  ui.show()

  sys.exit(app.exec_())

Ui_untitled.py

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

# Form implementation generated from reading ui file 'C:\Users\Administrator\Desktop\pyqt5\untitled.ui'
#
# Created by: PyQt5 UI code generator 5.5
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
  def setupUi(self, Dialog):
    Dialog.setObjectName("Dialog")
    Dialog.resize(357, 320)
    Dialog.setStyleSheet("font: 75 16pt \"Aharoni\";\n"
"background-color: rgb(206, 255, 251);")
    self.label = QtWidgets.QLabel(Dialog)
    self.label.setGeometry(QtCore.QRect(201, 210, 301, 21))
    self.label.setText("")
    self.label.setObjectName("label")
    self.Edit_xianshi = QtWidgets.QTextEdit(Dialog)
    self.Edit_xianshi.setGeometry(QtCore.QRect(0, 0, 351, 41))
    self.Edit_xianshi.setStyleSheet("font: 75 16pt \"Aharoni\";")
    self.Edit_xianshi.setObjectName("Edit_xianshi")
    self.gridLayoutWidget = QtWidgets.QWidget(Dialog)
    self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 30, 351, 281))
    self.gridLayoutWidget.setObjectName("gridLayoutWidget")
    self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
    self.gridLayout.setObjectName("gridLayout")
    self.Button_6 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_6.setObjectName("Button_6")
    self.gridLayout.addWidget(self.Button_6, 2, 2, 1, 1)
    self.Button_2 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_2.setObjectName("Button_2")
    self.gridLayout.addWidget(self.Button_2, 3, 1, 1, 1)
    self.Button_3 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_3.setObjectName("Button_3")
    self.gridLayout.addWidget(self.Button_3, 3, 2, 1, 1)
    self.Button_fenzhi = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_fenzhi.setObjectName("Button_fenzhi")
    self.gridLayout.addWidget(self.Button_fenzhi, 1, 3, 1, 1)
    self.Button_pingfang = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_pingfang.setObjectName("Button_pingfang")
    self.gridLayout.addWidget(self.Button_pingfang, 0, 3, 1, 1)
    self.Button_add = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_add.setObjectName("Button_add")
    self.gridLayout.addWidget(self.Button_add, 2, 3, 1, 1)
    self.Button_jian = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_jian.setObjectName("Button_jian")
    self.gridLayout.addWidget(self.Button_jian, 3, 3, 1, 1)
    self.Button_9 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_9.setObjectName("Button_9")
    self.gridLayout.addWidget(self.Button_9, 1, 2, 1, 1)
    self.Button_chu = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_chu.setObjectName("Button_chu")
    self.gridLayout.addWidget(self.Button_chu, 0, 2, 1, 1)
    self.Button_cheng = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_cheng.setObjectName("Button_cheng")
    self.gridLayout.addWidget(self.Button_cheng, 0, 1, 1, 1)
    self.Button_8 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_8.setObjectName("Button_8")
    self.gridLayout.addWidget(self.Button_8, 1, 1, 1, 1)
    self.Button_4 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_4.setObjectName("Button_4")
    self.gridLayout.addWidget(self.Button_4, 2, 0, 1, 1)
    self.Button_esc = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_esc.setObjectName("Button_esc")
    self.gridLayout.addWidget(self.Button_esc, 0, 0, 1, 1)
    self.Button_7 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_7.setObjectName("Button_7")
    self.gridLayout.addWidget(self.Button_7, 1, 0, 1, 1)
    self.Button_1 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_1.setObjectName("Button_1")
    self.gridLayout.addWidget(self.Button_1, 3, 0, 1, 1)
    self.Button_5 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_5.setObjectName("Button_5")
    self.gridLayout.addWidget(self.Button_5, 2, 1, 1, 1)
    self.pushButton_17 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.pushButton_17.setText("")
    self.pushButton_17.setObjectName("pushButton_17")
    self.gridLayout.addWidget(self.pushButton_17, 4, 0, 1, 1)
    self.Button_xiaoshu = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_xiaoshu.setObjectName("Button_xiaoshu")
    self.gridLayout.addWidget(self.Button_xiaoshu, 4, 1, 1, 1)
    self.Button_0 = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_0.setStyleSheet("")
    self.Button_0.setObjectName("Button_0")
    self.gridLayout.addWidget(self.Button_0, 4, 2, 1, 1)
    self.Button_dengyu = QtWidgets.QPushButton(self.gridLayoutWidget)
    self.Button_dengyu.setObjectName("Button_dengyu")
    self.gridLayout.addWidget(self.Button_dengyu, 4, 3, 1, 1)

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

  def retranslateUi(self, Dialog):
    _translate = QtCore.QCoreApplication.translate
    Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
    self.Edit_xianshi.setHtml(_translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Aharoni\'; font-size:16pt; font-weight:72; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'; font-weight:400;\">0</span></p></body></html>"))
    self.Button_6.setText(_translate("Dialog", "6"))
    self.Button_2.setText(_translate("Dialog", "2"))
    self.Button_3.setText(_translate("Dialog", "3"))
    self.Button_fenzhi.setText(_translate("Dialog", "1/^"))
    self.Button_pingfang.setText(_translate("Dialog", "^2"))
    self.Button_add.setText(_translate("Dialog", "+"))
    self.Button_jian.setText(_translate("Dialog", "-"))
    self.Button_9.setText(_translate("Dialog", "9"))
    self.Button_chu.setText(_translate("Dialog", "/"))
    self.Button_cheng.setText(_translate("Dialog", "*"))
    self.Button_8.setText(_translate("Dialog", "8"))
    self.Button_4.setText(_translate("Dialog", "4"))
    self.Button_esc.setText(_translate("Dialog", "esc"))
    self.Button_7.setText(_translate("Dialog", "7"))
    self.Button_1.setText(_translate("Dialog", "1"))
    self.Button_5.setText(_translate("Dialog", "5"))
    self.Button_xiaoshu.setText(_translate("Dialog", "."))
    self.Button_0.setText(_translate("Dialog", "0"))
    self.Button_dengyu.setText(_translate("Dialog", "="))


if __name__ == "__main__":
  import sys
  app = QtWidgets.QApplication(sys.argv)
  Dialog = QtWidgets.QDialog()
  ui = Ui_Dialog()
  ui.setupUi(Dialog)
  Dialog.show()
  sys.exit(app.exec_())

效果图:

python3.5 + PyQt5 +Eric6 实现的一个计算器代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之循环介绍
Aug 29 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
小米5s微信跳一跳小程序python源码
Jan 08 Python
Python交互环境下实现输入代码
Jun 22 Python
详解flask入门模板引擎
Jul 18 Python
Python requests库用法实例详解
Aug 14 Python
python实现五子棋小游戏
Mar 25 Python
Python3.6.x中内置函数总结及讲解
Feb 22 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
无需压缩软件,用python帮你操作压缩包
Aug 17 Python
如何判断pytorch是否支持GPU加速
Jun 01 Python
python语言中pandas字符串分割str.split()函数
Aug 05 Python
Python搭建HTTP服务器和FTP服务器
Mar 09 #Python
开源Web应用框架Django图文教程
Mar 09 #Python
Python运算符重载详解及实例代码
Mar 07 #Python
利用Python中的pandas库对cdn日志进行分析详解
Mar 07 #Python
python下os模块强大的重命名方法renames详解
Mar 07 #Python
深入理解python中的atexit模块
Mar 07 #Python
Python 备份程序代码实现
Mar 06 #Python
You might like
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
非常实用的12个jquery代码片段
2015/11/02 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
angular 实现同步验证器跨字段验证的方法
2019/04/11 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
在layui.use 中自定义 function 的正确方法
2019/09/16 Javascript
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
Python编程之序列操作实例详解
2017/07/22 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
八年级语文教学反思
2014/02/11 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
质量保证书格式模板
2015/02/27 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
小学教育见习总结
2015/06/23 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
《莫泊桑拜师》教学反思
2016/02/22 职场文书
你会写请假条吗?
2019/06/26 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
zabbix配置nginx监控的实现
2022/05/25 Servers