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 相关文章推荐
在Python web中实现验证码图片代码分享
Nov 09 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
Python实现的直接插入排序算法示例
Apr 29 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
Python 从列表中取值和取索引的方法
Dec 25 Python
Python基础教程之if判断,while循环,循环嵌套
Apr 25 Python
Pytorch之Variable的用法
Dec 31 Python
Python 实现黑客帝国中的字符雨的示例代码
Feb 20 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
如何理解Python中的变量
Jun 01 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
python中使用.py配置文件的方法详解
Nov 23 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
PHP数据类型的总结分析
2013/06/13 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
php使用google地图应用实例
2014/12/31 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
PHP工厂模式的日常使用
2019/03/20 PHP
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
JS 实现Json查询的方法实例
2013/04/12 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
2019/08/08 Javascript
判断JavaScript中的两个变量是否相等的操作符
2019/12/21 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Sanic框架基于类的视图用法示例
2018/07/18 Python
python读取文本中的坐标方法
2018/10/14 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
出纳员岗位责任制
2014/02/11 职场文书
党员承诺书怎么写
2014/05/20 职场文书
保护环境的标语
2014/06/09 职场文书
指导教师推荐意见
2015/06/05 职场文书