计算器-python
1 # coding: utf-8 2 3 import wx 4 from math import * 5 6 class CalcFrame(wx.Frame): 7 def __init__(self,title): 8 wx.Frame.__init__(self,None,-1,title,size=(300,320), 9 style=wx.DEFAULT_FRAME_STYLE^(wx.MINIMIZE_BOX|wx.MAXIMIZE_BOX)) 10 #建立面板 11 panel = wx.Panel(self) 12 #建sizer后,窗口可根据大小自动调整, wx.VERTICAL, wx.HORIZONTAL 13 boxsize = wx.BoxSizer(wx.VERTICAL) 14 #建grid便于放置控件 15 gridBox = wx.GridSizer(rows=6,cols=5,hgap=1,vgap=1) 16 self.equation=""#记录等式 17 18 #建计算器显示屏 19 #self.textprint = wx.TextCtrl(panel,-1,'',style=wx.TE_MULTILINE|wx.TE_READONLY) 20 self.textprint = wx.TextCtrl(panel,-1,'',style=wx.TE_RIGHT|wx.TE_READONLY) 21 self.bgFont = wx.Font(25,wx.SWISS,wx.NORMAL,wx.BOLD,face=u"Roboto") 22 23 self.textprint.SetFont(self.bgFont) 24 self.textprint.SetBackgroundColour((210, 210, 210)) 25 self.textprint.SetForegroundColour((15, 15, 15)) 26 27 #按钮数据 28 self.buttonData="% ^ sqrt pi AC sin ( ) e DEL cos 7 8 9 / tan 4 5 6 * ln 1 2 3 - log10 0 . = +".split() 29 30 #self.buttonData="7 8 9 DEL AC 4 5 6 * / 1 2 3 + - 0 % pi e sqrt ^ sin cos tan log10 ln ( ) . =".split() 31 32 buttonLength = len(self.buttonData) 33 for i in range(buttonLength): 34 labels="%s" %self.buttonData[i] 35 buttonIterm = wx.Button(panel,i,labels) 36 self.createHandler(buttonIterm,labels) 37 gridBox.Add(buttonIterm,0,flag=wx.EXPAND) 38 boxsize.Add(self.textprint,1,flag=wx.EXPAND) 39 boxsize.Add(gridBox,5,flag=wx.EXPAND) 40 panel.SetSizerAndFit(boxsize) 41 42 #创建按钮处理方法 43 def createHandler(self,button,labels): 44 item = "DEL AC =" 45 if labels not in item: 46 self.Bind(wx.EVT_BUTTON,self.OnAppend,button) 47 elif labels == 'DEL': 48 self.Bind(wx.EVT_BUTTON,self.OnDel,button) 49 elif labels == 'AC': 50 self.Bind(wx.EVT_BUTTON,self.OnAc,button) 51 elif labels == '=': 52 self.Bind(wx.EVT_BUTTON,self.OnTarget,button) 53 #添加运算符与数字 54 def OnAppend(self,event): 55 eventbutton = event.GetEventObject() 56 label = eventbutton.GetLabel() 57 self.equation += label 58 self.textprint.SetValue(self.equation) 59 def OnDel(self,event): 60 self.equation = self.equation[:-1] 61 self.textprint.SetValue(self.equation) 62 def OnAc(self,event): 63 self.textprint.Clear() 64 self.equation="" 65 def OnTarget(self,event): 66 string = self.equation 67 if '^' in string: 68 string = string.replace('^','**') 69 if 'ln' in string: 70 string = string.replace('ln','log') 71 try: 72 target = eval(string) 73 self.equation =str(target) 74 self.textprint.SetValue(str(target)) 75 except SyntaxError: 76 dlg = wx.MessageDialog(self,u'格式错误,请输入正确的等式!', 77 u'请注意', wx.OK|wx.ICON_INFORMATION) 78 dlg.ShowModal() 79 dlg.Destroy() 80 81 82 class App(wx.App): 83 def OnInit(self): 84 self.frame = CalcFrame(u'计算器') 85 self.frame.Center() 86 self.frame.Show() 87 return True 88 89 if __name__ == '__main__': 90 app = App() 91 app.MainLoop()
运行后如下: