[範例] 利用wxpython做一個陽春的計算機

看板Python作者 (lun)時間17年前 (2008/01/23 18:35), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串1/1
import wx, string char = u"清空 / * 7 8 9 4 5 6 1 2 3".split() other_char = "- + 0 . =".split() #span(rowspan, colspan) #設定位置與是否跨行、列 form = {'-' : {'pos' : (0, 3)}, '+' : {'pos' : (1, 3), 'span' : (2, 1)}, '=' : {'pos' : (3, 3), 'span' : (2, 1)}, '0' : {'pos' : (4, 0), 'span' : (1, 2)}, '.' : {'pos' : (4, 2)}} class Compute(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, '', size=(250, -1)) #設定按鈕需要用到的函式或是快速鍵 self.accel = { u'清空' : {'func' : self.OnEsc}, '/' : {'func' : self.OnDiv, 'ord' : 392}, '*' : {'func' : self.OnMulti, 'ord' : 387}, '-' : {'func' : self.OnDec, 'ord' : 390}, '+' : {'func' : self.OnAdd, 'ord' : 388}, '=' : {'func' : self.OnEnter}, '.' : {'func' : self.OnPoint, 'ord' : 391}, '0' : {'func' : self.OnZero, 'ord' : 48}, '1' : {'func' : self.OnOne, 'ord' : 49}, '2' : {'func' : self.OnTwo, 'ord' : 50}, '3' : {'func' : self.OnThree, 'ord' : 51}, '4' : {'func' : self.OnFour, 'ord' : 52}, '5' : {'func' : self.OnFive, 'ord' : 53}, '6' : {'func' : self.OnSix, 'ord' : 54}, '7' : {'func' : self.OnSeven, 'ord' : 55}, '8' : {'func' : self.OnEight, 'ord' : 56}, '9' : {'func' : self.OnNight, 'ord' : 57}} self.value1 = self.value2 = self.length = 0 self.oper = self.enter = '' self.panel = wx.Panel(self) #設定text有ENTER操作並且是從右邊開始輸入 self.text = wx.TextCtrl(self.panel, -1, '0', size=(230, -1), style=wx.TE_RIGHT | wx.TE_PROCESS_ENTER) self.text.Bind(wx.EVT_KEY_DOWN, self.OnKey) #宣告Sizer (垂直) VboxSizer = wx.BoxSizer(wx.VERTICAL) #設定Sizer與上框距離 VboxSizer.Add((0, 10)) #宣告Sizer (水平) HboxSizer = wx.BoxSizer(wx.HORIZONTAL) boxSizer = wx.BoxSizer(wx.HORIZONTAL) #將text加入HSizer並設定與右邊邊框的距離 HboxSizer.Add(self.text) HboxSizer.Add((5, 0)) #將HSizer加入VSizer並設定靠右對齊 VboxSizer.Add(HboxSizer, 0, wx.ALIGN_RIGHT) VboxSizer.Add((0,10)) self.sizer = wx.GridBagSizer(5, 5) self.CharSizer() boxSizer.Add(self.sizer) boxSizer.Add((10,0)) VboxSizer.Add(boxSizer, 0, wx.ALIGN_RIGHT) self.panel.SetSizer(VboxSizer) #配置各個按鈕 def CharSizer(self): acceltbl = [] for col in range(3): for row in range(4): ch = char[row*3 + col] button = wx.Button(self.panel, wx.NewId(), size=(35, 30), label=ch) self.sizer.Add(button, (row, col)) #每個按鈕對應各自的函式 self.Bind(wx.EVT_BUTTON, self.accel[ch]['func'], button) #快速鍵 if self.accel[ch].has_key('ord'): acceltbl.append((0, self.accel[ch]['ord'], button.GetId())) for ch in form: button = wx.Button(self.panel, wx.NewId(), size=(35, 30), label=ch) #如果需要跨航、列 if form[ch].has_key('span'): #按鈕、位置、跨越、樣式 self.sizer.Add(button, form[ch]['pos'], form[ch]['span'], wx.EXPAND) else: self.sizer.Add(button, form[ch]['pos']) if ch in self.accel: self.Bind(wx.EVT_BUTTON, self.accel[ch]['func'], button) if self.accel[ch].has_key('ord'): acceltbl.append((0, self.accel[ch]['ord'], button.GetId())) acceltbl = wx.AcceleratorTable(acceltbl) self.SetAcceleratorTable(acceltbl) #監聽text def OnKey(self, evt): code = evt.GetKeyCode() #如果為back或是del鍵 if code in (8, 127): if self.length: self.text.Remove(self.length, self.length-1) self.length -= 1 else: self.text.SetValue('') #如果為Esc則清空 elif code == 27: self.text.SetValue('0') self.length = self.value1 = self.value2 = 0 self.oper = self.enter = '' #如果為Enter則運算 elif code in (13, 370): self.value2 = self.GetValue() self.Operation() self.oper = '' #小數點判斷 def OnPoint(self, evt): if self.length == 0: self.text.SetValue('0.') self.length = 2 self.text.SetInsertionPointEnd() elif '.' not in self.text.GetValue(): self.OnNum('.') #0字元判斷 def OnZero(self, evt): text = self.text.GetValue() if (self.length == 1 and text[0] != '0') or '.' in text or self.length == 0 or self.length > 1: self.OnNum('0') def OnOne(self, evt): self.OnNum('1') def OnTwo(self, evt): self.OnNum('2') def OnThree(self, evt): self.OnNum('3') def OnFour(self, evt): self.OnNum('4') def OnFive(self, evt): self.OnNum('5') def OnSix(self, evt): self.OnNum('6') def OnSeven(self, evt): self.OnNum('7') def OnEight(self, evt): self.OnNum('8') def OnNight(self, evt): self.OnNum('9') def OnNum(self, num): if not self.length: self.text.SetValue(num) elif self.length < 30: self.text.SetValue(self.text.GetValue() + num) self.text.SetInsertionPointEnd() self.length += 1 def OnEsc(self, evt): self.text.SetValue('0') self.length = self.value1 = self.value2 = 0 self.oper = '' #除法 def OnDiv(self, evt): if not self.value1 and not self.oper: self.value1 = self.GetValue() elif self.length != 0: self.value2 = self.GetValue() self.Operation() self.oper = '/' self.length = 0 self.text.SetInsertionPointEnd() #乘法 def OnMulti(self, evt): if not self.value1 and not self.oper: self.value1 = self.GetValue() elif self.length != 0: self.value2 = self.GetValue() self.Operation() self.oper = '*' self.length = 0 self.text.SetInsertionPointEnd() #減法 def OnDec(self, evt): if not self.value1 and not self.oper: self.value1 = self.GetValue() elif self.length != 0: self.value2 = self.GetValue() elif self.oper == '-': self.value1 *= -1 self.text.SetValue(str(self.value1)) self.Operation() self.oper = '-' self.length = 0 self.text.SetInsertionPointEnd() #加法 def OnAdd(self, evt): if not self.value1 and not self.oper: self.value1 = self.GetValue() elif self.length != 0: self.value2 = self.GetValue() self.Operation() self.oper = '+' self.length = 0 self.text.SetInsertionPointEnd() def OnEnter(self, evt): self.value2 = self.GetValue() self.Operation() self.oper = '' #從text中傳回數值 def GetValue(self): text = self.text.GetValue() if '.' in text: return string.atof(text) else: return string.atol(text) #運算 def Operation(self): if self.length: if self.oper == '+': self.value1 += self.value2 elif self.oper == '-': self.value1 -= self.value2 elif self.oper == '*': self.value1 *= self.value2 elif self.oper == '/': self.value1 /= float(self.value2) if len(str(self.value1)) > 30: self.value1 = float(self.value1) self.text.SetValue(str(self.value1)) self.text.SetInsertionPointEnd() app = wx.PySimpleApp() Compute().Show() app.MainLoop() 主要是想說明Sizer真的很好用XD 裡面功能也只有加減乘除很陽春 Sizer中文說明可以看這邊 大陸人翻譯的 http://www.pythontik.com/blog/article.asp?id=275 大家都來腦力激盪一下( 別砲我0.0 ) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.127.61.5

01/23 21:14, , 1F
這個真的不錯喔^^對python麻瓜的我來說很受用:D
01/23 21:14, 1F

01/24 01:48, , 2F
01/24 01:48, 2F
文章代碼(AID): #17bnXLt8 (Python)
文章代碼(AID): #17bnXLt8 (Python)