[範例] 利用wxpython做一個陽春的計算機
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
01/23 21:14, 1F
推
01/24 01:48, , 2F
01/24 01:48, 2F
Python 近期熱門文章
PTT數位生活區 即時熱門文章