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 相关文章推荐
详解JavaScript编程中的window与window.screen对象
Oct 26 Python
利用python批量检查网站的可用性
Sep 09 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
在python中实现调用可执行文件.exe的3种方法
Jul 07 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
Django跨域请求原理及实现代码
Nov 14 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使之能同时支持GIF和JPEG
2006/10/09 PHP
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
详解Python 正则表达式模块
2018/11/05 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
房地产销售大学生自我评价分享
2013/11/11 职场文书
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
老公婚前保证书
2015/02/28 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
盗窃案辩护词
2015/05/21 职场文书
导游词之杭州西湖
2019/09/19 职场文书
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL