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实验报告文档

  • 4
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
python大作业 一、Turtle创意大PK 自拟题目,完成一个利用Python程序的创意绘图,采用turtle绘图为主,不少于50行代码,可选采用其他。 (滑稽绘制) 二、程序练习 2.1 问题描述(10分) 人们常常提到"一万小时定律",就是不管你做什么事情,只要坚持一万小时,应该都可以成为该领域的专家。那么,10000小时是多少年多少天呢? 2.2 问题描述(10分)0380031003800341590145037657 编写计算从n到m和的函数‬,函数名为sum(n,m)‬,函数返回值为n到m所有数据的和‬,使用该函数计算输入数据x,y之间所有数据的和。 2.3 问题描述(15分) 编写函数judgeTri(a,b,c),判断以参数a,b,c的值为边长能否构成三角形并判断三角形的形状;若是锐角三角形,返回R;若是直角三角形,返回Z;若是钝角三角形,返回D;若三边长不能构成三角形,返回ERROR。 2.4 问题描述(15分) 用户输入一个字符串,分别统计其中小写字母、大写字母、数字、空格和其他字符的个数,并在一行内输出小写字母、大写字母、数字、空格和其他字符的个数。 2.5 问题描述(20分) 程序的功能: (1) 使用随机功能,生成一个包含10个不重复且小于200的正整数列表ls1,输出ls1。‬ (2) 使用列表排序方法,对ls1按奇数在前偶数在后,并且奇数之间的相对顺序不变,偶数之间的相对顺序也不变进行排序,再输出ls1。‬ (3) 使用列表排序方法,对ls1按元素字符长度降序进行排序,输出ls1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

编程到天明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值