实现功能如下:
1.加、减、乘、除、小数点、括号
2.可从键盘输入运算式进行运算
3.计算历史记录保存
代码
'''
Author:YJJ
Time:2021/12/11 01:50
本计算器计算原理:
对初值为0的计算式进行操作,通过内置eval()函数得出最终结果
'''
import wx
class Calculator(wx.Frame): #总窗体类
calculation = "" #计算式初始化
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, 'Calculator', size=(420, 550))
panel = wx.Panel(self)
panel.SetBackgroundColour((139, 137, 137))
self.inputField = wx.ComboBox(panel, value="", pos=(0, 0), size=(300, 50))
'''
提供下拉框
'''
self.inputField.Bind(wx.EVT_TEXT, self.OnKeyTyped)
'''
对所有按钮进行设置
从上至下依次为:{'1', '2', '3', '4', '5',
'6', '7', '8', '9', '0',
'Clr', '+', '-', '*', '/',
'.', '(', ')','←'}
'''
btn1 = wx.Button(panel, label="1", pos=(0, 300), size=(100, 100)) # 设置按钮
self.Bind(wx.EVT_BUTTON, self.one, btn1) # 按钮绑定
btn1.SetBackgroundColour((255, 222, 173)) # 按钮颜色
btn2 = wx.Button(panel, label="2", pos=(100, 300), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.two, btn2)
btn2.SetBackgroundColour((255, 222, 173))
btn3 = wx.Button(panel, label="3", pos=(200, 300), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.three, btn3)
btn3.SetBackgroundColour((255, 222, 173))
btn4 = wx.Button(panel, label="4", pos=(0, 200), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.four, btn4)
btn4.SetBackgroundColour((255, 222, 173))
btn5 = wx.Button(panel, label="5", pos=(100, 200), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.five, btn5)
btn5.SetBackgroundColour((255, 222, 173))
btn6 = wx.Button(panel, label="6", pos=(200, 200), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.six, btn6)
btn6.SetBackgroundColour((255, 222, 173))
btn7 = wx.Button(panel, label="7", pos=(0, 100), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.seven, btn7)
btn7.SetBackgroundColour((255, 222, 173))
btn8 = wx.Button(panel, label="8", pos=(100, 100), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.eight, btn8)
btn8.SetBackgroundColour((255, 222, 173))
btn9 = wx.Button(panel, label="9", pos=(200, 100), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.nine, btn9)
btn9.SetBackgroundColour((255, 222, 173))
btn0 = wx.Button(panel, label="0", pos=(0, 400), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.zero, btn0)
btn0.SetBackgroundColour((255, 222, 173))
btnclr = wx.Button(panel, label="CLR", pos=(300, 0), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.clear, btnclr)
btnclr.SetBackgroundColour((240, 255, 255))
btnplus = wx.Button(panel, label="+", pos=(300, 400), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.plus, btnplus)
btnplus.SetBackgroundColour((240, 255, 255))
btnminus = wx.Button(panel, label="-", pos=(300, 300), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.minus, btnminus)
btnminus.SetBackgroundColour((240, 255, 255))
btnmultiply = wx.Button(panel, label="x", pos=(300, 200), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.multiply, btnmultiply)
btnmultiply.SetBackgroundColour((240, 255, 255))
btndivide = wx.Button(panel, label="/", pos=(300, 100), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.divide, btndivide)
btndivide.SetBackgroundColour((240, 255, 255))
btnpoint = wx.Button(panel, label=".", pos=(100, 400), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.point, btnpoint)
btnpoint.SetBackgroundColour((240, 255, 255))
btnequal = wx.Button(panel, label="=", pos=(200, 400), size=(100, 100))
self.Bind(wx.EVT_BUTTON, self.equal, btnequal)
btnequal.SetBackgroundColour((240, 255, 255))
btnleft = wx.Button(panel, label="(", pos=(0, 50), size=(100, 50))
self.Bind(wx.EVT_BUTTON, self.left, btnleft)
btnleft.SetBackgroundColour((240, 255, 255))
btnright = wx.Button(panel, label=")", pos=(100, 50), size=(100, 50))
self.Bind(wx.EVT_BUTTON, self.right, btnright)
btnright.SetBackgroundColour((240, 255, 255))
btnbackspace = wx.Button(panel, label="←", pos=(200, 50), size=(100, 50))
self.Bind(wx.EVT_BUTTON, self.backspace, btnbackspace)
btnbackspace.SetBackgroundColour((240, 255, 255))
def OnKeyTyped(self, event): #直接键盘输入
self.calculation = event.GetString()
'''
定义每一个按钮的操作
'''
def one(self, event):
self.calculation = self.calculation + "1"
self.inputField.SetValue(self.calculation)
def two(self, event):
self.calculation = self.calculation + "2"
self.inputField.SetValue(self.calculation)
def three(self, event):
self.calculation = self.calculation + "3"
self.inputField.SetValue(self.calculation)
def four(self, event):
self.calculation = self.calculation + "4"
self.inputField.SetValue(self.calculation)
def five(self, event):
self.calculation = self.calculation + "5"
self.inputField.SetValue(self.calculation)
def six(self, event):
self.calculation = self.calculation + "6"
self.inputField.SetValue(self.calculation)
def seven(self, event):
self.calculation = self.calculation + "7"
self.inputField.SetValue(self.calculation)
def eight(self, event):
self.calculation = self.calculation + "8"
self.inputField.SetValue(self.calculation)
def nine(self, event):
self.calculation = self.calculation + "9"
self.inputField.SetValue(self.calculation)
def zero(self, event):
self.calculation = self.calculation + "0"
self.inputField.SetValue(self.calculation)
def clear(self, event):
self.calculation = ""
self.inputField.SetValue(self.calculation)
def plus(self, event):
self.calculation = self.calculation + "+"
self.inputField.SetValue(self.calculation)
def minus(self, event):
self.calculation = self.calculation + "-"
self.inputField.SetValue(self.calculation)
def multiply(self, event):
self.calculation = self.calculation + "*"
self.inputField.SetValue(self.calculation)
def divide(self, event):
self.calculation = self.calculation + "/"
self.inputField.SetValue(self.calculation)
def point(self, event):
self.calculation = self.calculation + "."
self.inputField.SetValue(self.calculation)
def left(self, event):
self.calculation = self.calculation + "("
self.inputField.SetValue(self.calculation)
def right(self, event):
self.calculation = self.calculation + ")"
self.inputField.SetValue(self.calculation)
def backspace(self,event):
self.calculation = self.calculation[0:-1:1]
self.inputField.SetValue(self.calculation)
def equal(self, event):
try:
result = eval(self.calculation) #计算式求值
self.inputField.Insert(self.calculation, 0) #将历史记录加入下拉框
self.inputField.SetValue(str(result)) #输出框值为结果
except Exception as e:
self.inputField.SetValue('Input Illegal')
print(e)
return
finally:
self.calcuation = ""
if __name__ == '__main__':
app = wx.App()
frame = Calculator(parent=None, id=-1)
frame.Show()
app.MainLoop()