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程序运行效率的6个方法
Mar 31 Python
python迭代器与生成器详解
Mar 10 Python
Python语言实现获取主机名根据端口杀死进程
Mar 31 Python
Pycharm学习教程(1) 定制外观
May 02 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 Python
CentOS7下python3.7.0安装教程
Jul 30 Python
python selenium 弹出框处理的实现
Feb 26 Python
详解python中TCP协议中的粘包问题
Mar 22 Python
浅谈django 重载str 方法
May 19 Python
python 自动识别并连接串口的实现
Jan 19 Python
python实现A*寻路算法
Jun 13 Python
利用Python实现Picgo图床工具
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二分法在IP地址查询中的应用
2008/08/12 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
ThinkPHP模板中数组循环实例
2014/10/30 PHP
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
发布你的Python模块详解
2016/09/15 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
python实现人机猜拳小游戏
2020/02/03 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
营销与策划应届生求职信
2013/11/04 职场文书
专科文秘应届生求职信
2013/11/18 职场文书
2015年幼儿园毕业感言
2014/02/12 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
深入理解python协程
2021/06/15 Python
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis