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编写一个简单的Lisp解释器的教程
Apr 03 Python
用Python计算三角函数之atan()方法的使用
May 15 Python
Python实现运行其他程序的四种方式实例分析
Aug 17 Python
Python使用arrow库优雅地处理时间数据详解
Oct 10 Python
python虚拟环境的安装配置图文教程
Oct 20 Python
python实现京东秒杀功能
Jul 30 Python
python绘制多个曲线的折线图
Mar 23 Python
python实现弹窗祝福效果
Apr 07 Python
利用Python的sympy包求解一元三次方程示例
Nov 22 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
OpenCV+python实现实时目标检测功能
Jun 24 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 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
PHP中使用curl入门教程
2015/07/02 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
使用Yii2实现主从数据库设置
2016/11/20 PHP
YII框架中搜索分页jQuery写法详解
2016/12/19 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
javascript radio 联动效果
2009/03/04 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
Javascript调用C#代码
2011/01/17 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
python3.3实现乘法表示例
2014/02/07 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
python连接mongodb集群方法详解
2020/02/13 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
Python实现手绘图效果实例分享
2020/07/22 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
研究生自我鉴定范文
2013/10/30 职场文书
社区学习十八大感想
2014/01/22 职场文书
《手指教学》反思
2014/02/14 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
民主评议党员总结
2014/10/20 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript