python和wxpython编写的计算器 (中级水平)

source: http://blog.163.com/lxq_102172/blog/static/133398015201231012213428/

 # -*- coding: utf-8 -*-
from __future__ import division
import wx
import math
labels='1 1 1 1 1 MC MR MS M+ M- <- CE C +- Sqr 7 8 9 / % 4 5 6 * 1/x 1 2 3 - 0 0 . . + 2'.split()
class CalFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None, -1, 'Calculator', size=(230,310),
                         style=wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER | wx.MINIMIZE_BOX |wx.MAXIMIZE_BOX))
        panel=wx.Panel(self)
        panel.SetBackgroundColour('White')

        self.createMenubar()
        self.createButtons(panel)
        
    def createMenubar(self):    
        menuBar=wx.MenuBar() 
        menu1=wx.Menu()
        menuBar.Append(menu1,"View")
        menu2=wx.Menu()
        menuBar.Append(menu2,"Edit")
        menu3=wx.Menu()
        menuBar.Append(menu3,"Help")
        self.SetMenuBar(menuBar)

    def createButtons(self,panel):
        sizer = wx.GridBagSizer(hgap=5, vgap=5)#grid sizer
        self.text=wx.TextCtrl(panel, wx.NewId(),value='0', style=wx.TE_READONLY |
                              wx.TE_RIGHT | wx.TE_NOHIDESEL, size=(50,50))
        sizer.Add(self.text,pos=(0,0),span=(1,5),flag=wx.EXPAND)
        i=0
        for row in range(1,7):
            for col in range(5):
                i=i+1
                self.button=wx.Button(panel, label=str(labels[row*5+col]),size=(40,30), id=i)
                self.button.Bind(wx.EVT_BUTTON, self.Handler, self.button) 
                sizer.Add(self.button,pos=(row,col))

        sizer.Detach(25)
        sizer.Detach(29)
        sizer.Detach(25)
        sizer.Detach(25)
        
        self.button=wx.Button(panel, label='=',size=(40,60), id=30)
        self.button.Bind(wx.EVT_BUTTON,self.Handler, self.button)
        sizer.Add(self.button,pos=(5,4),span=(2,1),flag=wx.EXPAND)
        self.button=wx.Button(panel,label='0',id=25)
        self.button.Bind(wx.EVT_BUTTON,self.Handler, self.button)
        sizer.Add(self.button,pos=(6,0),span=(1,2),flag=wx.EXPAND)
        
        panel.SetSizer(sizer)
        panel.Fit()

        self.operand1=None
        self.operand2=None
        self.operator=None
        self.temp1=0
        
    def Handler(self,event):
        Id=event.GetId()
        if Id in [11,12,13,16,17,18,21,22,23,25]:
            if self.text.GetValue()=='0':
               self.text.SetValue('')
               self.text.AppendText(event.GetEventObject().GetLabel())
            else:
                self.text.SetValue(self.text.GetValue()+event.GetEventObject().GetLabel())
                
        elif Id==28: #.
            if '.' in self.text.GetValue()[(self.Index()+1):]:
                self.text.SetValue(self.text.GetValue())
            else:
                self.text.SetValue(self.text.GetValue()+event.GetEventObject().GetLabel())
                
        elif Id==8: #C
            self.text.SetValue('0')
            self.operand1=None
            self.operand2=None
            self.operator=None
            self.temp1=0
            
        elif Id==7: #CE
            self.text.SetValue(self.text.GetValue()[0:(self.Index()+1)])
        elif Id==6: #<-
            self.text.SetValue(self.text.GetValue()[0:-1])
            if len(self.text.GetValue())<=0:
                self.text.SetValue('0')
                 
        elif Id==9: #+-
            if self.text.GetValue()=='0':
                pass
            else:           
                if self.text.GetValue()[0]!='-' & self.operand2==None:                
                    self.text.SetValue('-'+self.text.GetValue())
                else:
                    self.text.SetValue(self.text.GetValue()[1:])
                if self.operand2!=None:
                    pass
                
        elif Id==10: #Sqr
            try:
                self.text.SetValue(str(math.sqrt(float(self.text.GetValue()))))
            except ValueError:
                 self.text.SetValue('ValueError:math domain error')
            
        elif Id==29: #+
            self.temp1=self.temp1+1
            self.operator='+'
            self.Repeat()
        elif Id==24: #-
            self.temp1=self.temp1+1
            self.operator='-'
            self.Repeat()
        elif Id==19: #*
            self.temp1=self.temp1+1
            self.operator='*'
            self.Repeat()
        elif Id==14: #/
            self.temp1=self.temp1+1
            self.operator='/'
            self.Repeat()
            
        elif Id==20: #1/x
            try:
                self.text.SetValue(str(1.0/(float(self.text.GetValue()))))
            except ZeroDivisionError:
                self.text.SetValue('ZeroDivisionError: float division by zero')
                            
        elif Id==15: #%
            self.operand2=eval(self.operand1) * eval(self.operand2)/100.0
            self.operand2=str(self.operand2)
            self.Result()
            self.temp1=0
            
        elif Id==30: #=
            self.Result()
            self.temp1=0
  
        if self.temp1>=2:
            try:
                if self.operand2!=None and self.operand2!='' and self.operand1!=None and self.operator!=None:
                    self.text.SetValue(str(eval(self.operand1 + self.operator + self.operand2)))
                    self.operand1=self.text.GetValue()
                    self.operand2=None
                else:
                    pass
            except ZeroDivisionError:
                self.text.SetValue('ZeroDivisionError: float division by zero')
            self.Repeat()
            self.temp1=1
            
        if self.temp1%2==0:
            if self.operator==None:
                self.operand1=self.text.GetValue()
            else:
                self.operand1=self.text.GetValue()[0:self.Index()]
        else:         
            self.operand2=self.text.GetValue()[(self.Index()+1):]

        print self.operand1,self.operator, self.operand2

    def Index(self):  #���ز������±�
        a=list(self.text.GetValue())
        if self.operator==None or self.operator not in a:
            b=-1
        else:
            b=a.index(self.operator)
        return b

    def Repeat(self):
        if self.text.GetValue()[-1] in '+-*/':
           self.text.SetValue(self.text.GetValue()[0:self.Index()]
                              +self.operator)
        else:
           self.text.SetValue(self.text.GetValue()+self.operator)
                              
                  
    def Result(self):
        try:
            if self.operand1!=None and self.operator!=None:
                self.text.SetValue(str(eval(self.operand1 + self.operator + self.operand2)))
                self.operand1=None
                self.operand2=None
                self.operator=None
                self.temp1=0
        except ZeroDivisionError:
            self.text.SetValue('ZeroDivisionError: float division by zero')
         
app=wx.PySimpleApp()
frame=CalFrame()
frame.Show()
app.MainLoop()


posted @ 2022-04-29 22:37  WORDLESS  阅读(51)  评论(0编辑  收藏  举报