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计算三角函数之acos()方法的使用
May 15 Python
Python内建数据结构详解
Feb 03 Python
Python批量修改文本文件内容的方法
Apr 29 Python
python实现多线程的两种方式
May 22 Python
Python跨文件全局变量的实现方法示例
Dec 10 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
Python使用ConfigParser模块操作配置文件的方法
Jun 29 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
python多任务及返回值的处理方法
Jan 22 Python
使用python将多个excel文件合并到同一个文件的方法
Jul 09 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
python中append函数用法讲解
Dec 11 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
ASP和PHP都是可以删除自身的
2007/04/09 PHP
PHP中的array数组类型分析说明
2010/07/27 PHP
PHP开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
destoon整合UCenter图文教程
2014/06/21 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
vue实现微信分享功能
2018/11/28 Javascript
vue resource发送请求的几种方式
2019/09/30 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
python中pika模块问题的深入探究
2018/10/13 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
班主任工作经验材料
2014/02/02 职场文书
大学生评语大全
2014/04/18 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
Python OpenCV形态学运算示例详解
2022/04/07 Python