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中使用动态变量名的方法
May 06 Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 Python
Python的Django框架中if标签的相关使用
Jul 15 Python
python:socket传输大文件示例
Jan 18 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
Python实现线程状态监测简单示例
Mar 28 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
Python通用函数实现数组计算的方法
Jun 13 Python
django中账号密码验证登陆功能的实现方法
Jul 15 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
python实现按关键字筛选日志文件
Dec 24 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使用GD2绘制几何图形示例
2017/02/15 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
插件:检测javascript的内存泄漏
2007/03/04 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
jquery实现拖动效果
2016/08/10 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
通过命令行生成vue项目框架的方法
2017/07/12 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
vuejs点击class变化的实例
2018/09/05 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
js闭包的9个使用场景
2020/12/29 Javascript
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
python使用epoll实现服务端的方法
2018/10/16 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
简约控的天堂:The Undone
2016/12/21 全球购物
酒店员工检讨书
2014/02/18 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
场地使用证明模板
2014/10/25 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
军事博物馆观后感
2015/06/05 职场文书
亮剑精神观后感
2015/06/05 职场文书
工作年限证明范本
2015/06/15 职场文书
《雷雨》教学反思
2016/02/20 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL