Python大作业——两种方法设计计算器(使用wx库)。

python大作业

本次设计用Pycharm开发工具,Python语言进行主要功能是基于图形用户面的多功能。该计算器的主要功能是加、减、乘、除等常规运算以及指数,对数,三角函数等科学运算功能。该计算器分为数据输入模块和运算规则选择模块以及过程和结果显示模块三个模块。

第一种方法

该方法较简单。
代码如下:

# -*- coding:utf-8 -*-
import wx

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, id=100, title='计算器', size=(250, 350)) #初始化界面窗口
        panel = wx.Panel(self)
        # 创建文本框
        self.entry = wx.TextCtrl(panel, id=15, pos=(10, 0), size=(195, 28), style=wx.TE_RIGHT) #定义文本框的属性
        #创建按钮
        self.b_clear = wx.Button(parent=panel, id=10, label='C', pos=(10, 30), size=(45, 45)) #定义计算器的各个按钮,label是名称,pos是位置,size是按钮的大小
        self.b_divide = wx.Button(parent=panel, id=11, label='/', pos=(60, 30), size=(45, 45))
        self.b_multiply = wx.Button(parent=panel, id=12, label='*', pos=(110, 30), size=(45, 45))
        self.b_backspace = wx.Button(parent=panel, id=13, label='←', pos=(160, 30), size=(45, 45))
        self.b_sub = wx.Button(parent=panel, id=14, label='-', pos=(160, 80), size=(45, 45))
        self.b_add = wx.Button(parent=panel, id=15, label='+', pos=(160, 130), size=(45, 45))
        self.b_point = wx.Button(parent=panel, id=16, label='.', pos=(110, 230), size=(45, 45))
        self.b_equal = wx.Button(parent=panel, id=17, label='=', pos=(160, 180), size=(45, 95))
        self.b_zero = wx.Button(parent=panel, id=0, label='0', pos=(10, 230), size=(95, 45))
        self.b_seven = wx.Button(parent=panel, id=7, label='7', pos=(10, 80), size=(45, 45))
        self.b_eight = wx.Button(parent=panel, id=8, label='8', pos=(60, 80), size=(45, 45))
        self.b_nine = wx.Button(parent=panel, id=9, label='9', pos=(110, 80), size=(45, 45))
        self.b_six = wx.Button(parent=panel, id=6, label='6', pos=(110, 130), size=(45, 45))
        self.b_five = wx.Button(parent=panel, id=5, label='5', pos=(60, 130), size=(45, 45))
        self.b_four = wx.Button(parent=panel, id=4, label='4', pos=(10, 130), size=(45, 45))
        self.b_three = wx.Button(parent=panel, id=3, label='3', pos=(110, 180), size=(45, 45))
        self.b_two = wx.Button(parent=panel, id=2, label='2', pos=(60, 180), size=(45, 45))
        self.b_one = wx.Button(parent=panel, id=1, label='1', pos=(10, 180), size=(45, 45))
        #创建捆绑事件
        self.b_one.Bind(wx.EVT_BUTTON, self.B_one, self.b_one) #使用wx.Bind将按钮和事件捆绑起来
        self.b_two.Bind(wx.EVT_BUTTON, self.B_two, self.b_two)
        self.b_three.Bind(wx.EVT_BUTTON, self.B_three, self.b_three)
        self.b_four.Bind(wx.EVT_BUTTON, self.B_four, self.b_four)
        self.b_five.Bind(wx.EVT_BUTTON, self.B_five, self.b_five)
        self.b_six.Bind(wx.EVT_BUTTON, self.B_six, self.b_six)
        self.b_seven.Bind(wx.EVT_BUTTON, self.B_seven, self.b_seven)
        self.b_eight.Bind(wx.EVT_BUTTON, self.B_eight, self.b_eight)
        self.b_nine.Bind(wx.EVT_BUTTON, self.B_nine, self.b_nine)
        self.b_zero.Bind(wx.EVT_BUTTON, self.B_zero, self.b_zero)
        self.b_divide.Bind(wx.EVT_BUTTON, self.B_divide, self.b_divide)
        self.b_clear.Bind(wx.EVT_BUTTON, self.B_clear, self.b_clear)
        self.b_multiply.Bind(wx.EVT_BUTTON, self.B_multiply, self.b_multiply)
        self.b_backspace.Bind(wx.EVT_BUTTON, self.B_backspace, self.b_backspace)
        self.b_sub.Bind(wx.EVT_BUTTON, self.B_sub, self.b_sub)
        self.b_add.Bind(wx.EVT_BUTTON, self.B_add, self.b_add)
        self.b_equal.Bind(wx.EVT_BUTTON, self.B_equal, self.b_equal)
        self.b_point.Bind(wx.EVT_BUTTON, self.B_point, self.b_point)
#创建按钮点击事件
    def B_one(self,event): #创建捆绑的事件
        self.entry.AppendText("1")
    def B_two(self, event):
        self.entry.AppendText("2")
    def B_three(self, event):
        self.entry.AppendText("3")
    def B_four(self, event):
        self.entry.AppendText("4")
    def B_five(self, event):
        self.entry.AppendText("5")
    def B_six(self, event):
        self.entry.AppendText("6")
    def B_seven(self, event):
        self.entry.AppendText("7")
    def B_eight(self, event):
        self.entry.AppendText("8")
    def B_nine(self, event):
        self.entry.AppendText("9")
    def B_zero(self, event):
        self.entry.AppendText("0")
    def B_point(self, event):
        self.entry.AppendText(".")
    def B_add(self, event):
        self.entry.AppendText("+")
    def B_sub(self, event):
        self.entry.AppendText("-")
    def B_multiply(self, event):
        self.entry.AppendText("*")
    def B_divide(self, event):
        self.entry.AppendText("/")
    def B_clear(self, event):
        self.entry.Clear()
    def B_backspace(self, event):
        input_len = len(self.entry.GetValue())
        self.entry.Remove(input_len - 1, input_len)
    def B_equal(self,event):
        try:
            pre_result = str(self.entry.GetValue())
            result = eval(pre_result)
            self.entry.SetValue(str(result))
        except:
            self.entry.SetValue("Error")

if __name__ == '__main__':
    app = wx.App() 
    MyFrame(None).Show() 
    app.MainLoop() 


效果如下:
在这里插入图片描述

第二种方法

该方法较第一种复杂,但是实现的功能更多。
代码如下:

# -*- coding:utf-8 -*-
import wx
from math import *
class Calculator(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "计算器", size=(350, 480),
            style=wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER |wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX))
        panel = wx.Panel(self)
        boxsize = wx.BoxSizer(wx.VERTICAL)
        gridBox = wx.GridSizer(rows=6, cols=5, hgap=5, vgap=5)
        self.equation = ""  # 记录等式
        self.textprint = wx.TextCtrl(panel, -1, '', style=wx.TE_MULTILINE | wx.TE_READONLY)
        # 按钮数据
        self.buttonData = "% pi e ← C sqrt ^ ln log tan 7 8 9 cos sin  4 5 6 + - 1 2 3  * / 0 ( ) . =".split()
        buttonLength = len(self.buttonData) #使用循环来定义按钮的属性,简化代码
        for i in range(buttonLength):
            labels = "%s" % self.buttonData[i]
            buttonIterm = wx.Button(panel, i, labels, size=(63, 52))
            self.bangding(buttonIterm, labels) #调用绑定方法,减少重复性工作
            gridBox.Add(buttonIterm, 0, 0)
        boxsize.Add(self.textprint, 1, wx.EXPAND)
        boxsize.Add(gridBox, 5, wx.EXPAND)
        panel.SetSizerAndFit(boxsize)
    # 创建绑定方法
    def bangding(self, button, labels):
        item = "← C ="
        if labels not in item:
            self.Bind(wx.EVT_BUTTON, self.OnAppend, button)
        elif labels == '←':
            self.Bind(wx.EVT_BUTTON, self.OnDel, button)
        elif labels == 'C':
            self.Bind(wx.EVT_BUTTON, self.OnAc, button)
        elif labels == '=':
            self.Bind(wx.EVT_BUTTON, self.OnTarget, button)
    # 添加运算符与数字
    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 = "" #将文本框的内容清空,实现归零
    def OnTarget(self, event):
        string = self.equation
        if '^' in string:
            string = string.replace('^', '**') #将指数符号进行转换,便于eval()函数进行识别
        try:
            target = eval(string)
            self.equation += '=' + str(target)
            self.textprint.SetValue(self.equation)
        except SyntaxError:
            dlg = wx.MessageDialog(self, '请输入正确的等式!', '请注意',
                                   wx.OK | wx.ICON_INFORMATION)
            dlg.ShowModal()
            dlg.Destroy()

if __name__ == '__main__':
    app = wx.App()
    frame = Calculator()
    frame.Show()
    app.MainLoop()

效果如下:
在这里插入图片描述
详细实验报告:python实验报告文档

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程到天明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值