计算器-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()

运行后如下:

posted @ 2016-02-27 14:43  YXY的Blog  阅读(265)  评论(0编辑  收藏  举报