实验楼
你需要有以下基础
- python2.7基本语法
- python面向对象的语法基础
你将学习到以下内容
- 了解一些控件的使用以及布局
- 了解wx.BoxSizer
- 了解wx.GridSizer
- 了解wx.TextCtrl
- 了解wx.Button的回调函数
步骤
1.wxpython基础知识
Frame类学习
一个最简单的窗体就是:
#coding=utf-8
import wx
app = wx.App()#初始化应用程序
frame = wx.Frame(None)
frame.Show()#创建一个 Frame(就是窗体),并显示出来。
app.MainLoop()#应用程序进入消息循环
2.绘制计算器
#coding=utf-8
import math
import wx
class CalcFrame(wx.Frame):
def __init__(self,title):
super(CalcFrame, self).__init__(None, title = title, size = (300, 250))
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
pass
if __name__ == '__main__':
app = wx.App()
CalcFrame(title = 'Calculator')
app.MainLoop()
关键在于InitUI方法
下面介绍InitUI方法:
- BoxSizer
这个东西可以允许我们以行或列放置控件,默认是以行放置。 - TextCtrl学习
- GridSizer网格布局
- Button文本按钮
建议大家可以学习一下wxpython基本控件
#coding=utf-8
import math
import wx
class CalcFrame(wx.Frame):
def __init__(self,title):
super(CalcFrame, self).__init__(None, title = title, size = (300, 250))
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
vbox = wx.BoxSizer(wx.VERTICAL)#以列放置,文本框在最上方
self.textprint = wx.TextCtrl(self, style=wx.TE_RIGHT)
vbox.Add(self.textprint, flag=wx.EXPAND|wx.TOP|wx.BOTTOM, border=4)
gridBox = wx.GridSizer(5, 4, 5, 5)##行数,列数,垂直间隔,水平间隔
labels=['AC','DEL','PI','CLOSE','7','8','9','/','4','5','6','*','1','2','3','-','0','.','=','+']
for label in labels:
gridBox.Add(wx.Button(self,label = label), 1, wx.EXPAND)
vbox.Add(gridBox, proportion=1, flag=wx.EXPAND)
self.SetSizer(vbox)
if __name__ == '__main__':
app = wx.App()
CalcFrame(title = 'Calculator')
app.MainLoop()
运行一下你可以看到计算器的界面
3.TextCtrl修改
现在TextCtrl可以按键盘输入数字,我们只希望计算器上的数字被输入,不希望键盘输入。可以把TextCtrl初始化参数改为:
self.textprint = wx.TextCtrl(self, -1,'', style=wx.TE_RIGHT)
存储textprint的内容
self.equation = ""#初始化文本框的内容
通过
self.textprint.SetValue(self.equation)
就可以把equation的内容显示在textprint上。
4.Button的回调函数
点击不同按钮我们希望根据按钮的label选择不同的回调函数进行绑定。
for label in labels:
buttonItem = wx.Button(self,label=label)
self.createHandler(buttonItem,label)
gridBox.Add(buttonItem, 1, wx.EXPAND)
然后需要实现createHandler方法
def createHandler(self,button,labels):
item = ['del','AC','=','CLOSE']
if labels not in item:
self.Bind(wx.EVT_BUTTON,self.OnAppend,button)
elif labels == 'DEL':
self.Bind(wx.EVT_BUTTON,self.OnDel,button)
elif labels == 'AC':
self.Bind(wx.EVT_BUTTON,self.OnAc,button)
elif labels == '=':
self.Bind(wx.EVT_BUTTON,self.OnTarget,button)
elif labels == 'CLOSE':
self.Bind(wx.EVT_BUTTON,self.OnExit,button)
最后根据label的不同,把按钮绑定到回调函数上
def OnAppend(self,event):
eventbutton = event.GetEventObject()
label = eventbutton.GetLabel()
self.equation += label
self.textprint.SetValue(self.equation)
def OnDel(self,event):
self.equation = self.equation[:-1]
self.textprint.SetValue(self.equation)
def OnAc(self,event):
self.textprint.Clear()
self.equation=""
self.textprint.SetValue(self.equation)
def OnTarget(self,event):
string = self.equation
try:
target = eval(string) #eval会计算字符串形式的Python表达式,并返回结果的值
self.equation = str(target)
self.textprint.SetValue(self.equation)
except SyntaxError:
dlg = wx.MessageDialog(self,u'格式错误,请输入正确的等式!',wx.OK|wx.ICON_INFORMATION)#消息对话框
dlg.ShowModal()
dlg.Destroy()
def OnExit(self,event):
self.Close()
报错跳出消息对话框
这个计算器的功能还太弱,有兴趣可以去实现sqrt,log,cos,sin等功能
一起努力~