Python实现的简单计算器功能详解


Posted in Python onAugust 25, 2018

本文实例讲述了Python实现的简单计算器功能。分享给大家供大家参考,具体如下:

使用python编写一款简易的计算器

Python实现的简单计算器功能详解
计算器效果图

首先搭建计算器的面板:

Python实现的简单计算器功能详解
计算器面板结构

建造一个继承于wx.Frame的frame,在init属性函数中搭建面板

class CalcFrame(wx.Frame):#建造一个继承于wx.Frame的frame
  def __init__(self,title):
    wx.Frame.__init__ (self,None,-1,title,
              pos=(100,300),size=(300,320))
    panel=wx.Panel(self)
    boxsize=wx.BoxSizer(wx.VERTICAL)
    gridBox=wx.GridSizer(4,4,1,1)
    self.equation=""#记录一个等式,把它print到TextCtrl中

建立计算机显示屏TextCtrl

self.textprint=wx.TextCtrl(panel,-1,'',style=wx.TE_RIGHT|wx.TE_READONLY)#文本控制控件
    self.bgFont=wx.Font(25,wx.SWISS,wx.NORMAL,wx.BOLD,face=u'Roboto')#设置字体样式
    self.textprint.SetFont(self.bgFont)#使用SetFont将设置的字体样式运用在textprint中
    self.textprint.SetForegroundColour('black')#设置前景色
    self.textprint.SetBackgroundColour('white')#设置后景色

按钮

self.buttonData="7 8 9 DEL 4 5 6 AC 1 2 3 * / + - =".split()
    #产生buttonIterm的label
    #将label分配到按钮上去
    buttonLength=len(self.buttonData)
    for i in range(buttonLength):
      labels="%s" %self.buttonData[i]
      buttonIterm = wx.Button(panel,i,labels)
      self.createHandler(buttonIterm,labels)
      gridBox.Add(buttonIterm,0,flag=wx.EXPAND)

将textprint与buttonIterm放入boxsize中,再将将boxsize放入panel里

boxsize.Add(self.textprint,1,flag=wx.EXPAND)#在boxsize中加上文本控制控件,比例为1
    boxsize.Add(gridBox,5,flag=wx.EXPAND)
    panel.SetSizerAndFit(boxsize)#将boxsize放入panel里

创建不同按钮触发的不同函数

def createHandler(self,button,labels):
    #self.Bind(wx.EVT_BUTTON, self.OnButton1, self.Button1)
    #这里self是一个Frame(wxPython中的窗体这样的东西),而Button1是放在这个Frame下面的一个Button,self.OnButton1就是事件处理函数。而wxPython定死了事件处理函数的形式:
    items="DEL AC ="
    if labels not in items:
      self.Bind(wx.EVT_BUTTON,self.OnAppend,button)
    elif labels=='DEL':
      self.Bind(wx.EVT_BUTTON,self.OnDel,button)
    elif labels=='AC':
      self.Bind(wx.EVT_BUTTON,self.OnAc,button)
    elif labels=='=':
      self.Bind(wx.EVT_BUTTON,self.OnEqual,button)

不同函数的具体执行过程

def OnAppend(self,event):
    eventbutton = event.GetEventObject()
    label = eventbutton.GetLabel()
    self.equation += label
    self.textprint.SetValue(self.equation)
  def OnDel(self,event):
    self.equation=self.equation[:-1]
    self.textprint.SetValue(self.equation)
  def OnAc(self,event):
    self.textprint.Clear()
    self.equation=""
  def OnEqual(self,event):
    string=self.equation
    try:
      taget=eval(string)#执行这段代码得到的结果
      self.equation=str(taget)
      self.textprint.SetValue(self.equation)
    except SyntaxError:#弹出消息对话框
      dlg=wx.MessageDialog(self,u'输入格式错误',wx.Ok|wx.ICON_INFORMATION)
      dlg.ShowModal()
      dlg.Destory()

APP类

class App(wx.App):
  def OnInit(self):
    self.frame =CalcFrame(u'计算器')
    self.frame.Center()
    self.frame.Show()
    return True

测试代码:

if __name__=="__main__":
  app=App()
  app.MainLoop()

完整示例代码如下:

# -*- coding:utf-8 -*-
'''
Created on 2018年8月25日
@author: Administrator
'''
import wx
class CalcFrame(wx.Frame):#建造一个继承于wx.Frame的frame
  def __init__(self,title):
    wx.Frame.__init__ (self,None,-1,title,
              pos=(100,300),size=(300,320))
    panel=wx.Panel(self)
    boxsize=wx.BoxSizer(wx.VERTICAL)
    gridBox=wx.GridSizer(4,4,1,1)
    self.equation=""#记录一个等式,把它print到TextCtrl中
    self.textprint=wx.TextCtrl(panel,-1,'',style=wx.TE_RIGHT|wx.TE_READONLY)#文本控制控件
    self.bgFont=wx.Font(25,wx.SWISS,wx.NORMAL,wx.BOLD,face=u'Roboto')#设置字体样式
    self.textprint.SetFont(self.bgFont)#使用SetFont将设置的字体样式运用在textprint中
    self.textprint.SetForegroundColour('black')#设置前景色
    self.textprint.SetBackgroundColour('white')#设置后景色
    self.buttonData="7 8 9 DEL 4 5 6 AC 1 2 3 * / + - =".split()
    #产生buttonIterm的label
    #将label分配到按钮上去
    buttonLength=len(self.buttonData)
    for i in range(buttonLength):
      labels="%s" %self.buttonData[i]
      buttonIterm = wx.Button(panel,i,labels)
      self.createHandler(buttonIterm,labels)
      gridBox.Add(buttonIterm,0,flag=wx.EXPAND)
    boxsize.Add(self.textprint,1,flag=wx.EXPAND)#在boxsize中加上文本控制控件,比例为1
    boxsize.Add(gridBox,5,flag=wx.EXPAND)
    panel.SetSizerAndFit(boxsize)#将boxsize放入panel里
  def createHandler(self,button,labels):
    #self.Bind(wx.EVT_BUTTON, self.OnButton1, self.Button1)
    #这里self是一个Frame(wxPython中的窗体这样的东西),而Button1是放在这个Frame下面的一个Button,self.OnButton1就是事件处理函数。而wxPython定死了事件处理函数的形式:
    items="DEL AC ="
    if labels not in items:
      self.Bind(wx.EVT_BUTTON,self.OnAppend,button)
    elif labels=='DEL':
      self.Bind(wx.EVT_BUTTON,self.OnDel,button)
    elif labels=='AC':
      self.Bind(wx.EVT_BUTTON,self.OnAc,button)
    elif labels=='=':
      self.Bind(wx.EVT_BUTTON,self.OnEqual,button)
  def OnAppend(self,event):
    eventbutton = event.GetEventObject()
    label = eventbutton.GetLabel()
    self.equation += label
    self.textprint.SetValue(self.equation)
  def OnDel(self,event):
    self.equation=self.equation[:-1]
    self.textprint.SetValue(self.equation)
  def OnAc(self,event):
    self.textprint.Clear()
    self.equation=""
  def OnEqual(self,event):
    string=self.equation
    try:
      taget=eval(string)#执行这段代码得到的结果
      self.equation=str(taget)
      self.textprint.SetValue(self.equation)
    except SyntaxError:#弹出消息对话框
      dlg=wx.MessageDialog(self,u'输入格式错误',wx.Ok|wx.ICON_INFORMATION)
      dlg.ShowModal()
      dlg.Destory()
class App(wx.App):
  def OnInit(self):
    self.frame =CalcFrame(u'计算器')
    self.frame.Center()
    self.frame.Show()
    return True
if __name__=="__main__":
  app=App()
  app.MainLoop()

PS:这里再为大家推荐几款计算工具供大家进一步参考借鉴:

在线一元函数(方程)求解计算工具:
http://tools.3water.com/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.3water.com/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.3water.com/jisuanqi/jsq

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
Feb 18 Python
python增加矩阵维度的实例讲解
Apr 04 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
浅谈Django中view对数据库的调用方法
Jul 18 Python
python用requests实现http请求代码实例
Oct 31 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
详解Pymongo常用查询方法总结
Jan 29 Python
python3定位并识别图片验证码实现自动登录功能
Jan 29 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 #Python
Python使用matplotlib绘制三维图形示例
Aug 25 #Python
Python实现的括号匹配判断功能示例
Aug 25 #Python
Django中使用Celery的教程详解
Aug 24 #Python
python tornado微信开发入门代码
Aug 24 #Python
python使用rpc框架gRPC的方法
Aug 24 #Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 #Python
You might like
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
PHP 数组遍历顺序理解
2009/09/09 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
Vue-cli3项目配置Vue.config.js实战记录
2018/07/29 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
简明 Python 基础学习教程
2007/02/08 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
什么是python的函数体
2020/06/19 Python
python3将变量输入的简单实例
2020/08/19 Python
应届生个人求职信模板
2013/11/26 职场文书
信用社员工先进事迹材料
2014/02/04 职场文书
优秀应届生求职信
2014/06/16 职场文书
联欢会开场白
2015/06/01 职场文书
企业宣传稿范文
2015/07/23 职场文书
如何获取numpy array前N个最大值
2021/05/14 Python