用wxpython做一个计算器

实验楼

你需要有以下基础

  • 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()

运行一下你可以看到计算器的界面


用wxpython做一个计算器_第1张图片

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等功能
一起努力~

用wxpython做一个计算器_第2张图片

你可能感兴趣的:(用wxpython做一个计算器)