Project1 计算器的设计与实现

Day1

实验要求:

  1. 能通过设计的按钮控件输入并实现简单算术运算,要求
    表达式在编辑框中显示,能将运算结果,输出在编辑框
    内显示;
  2. 能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;并且能够识别括号,优先级正确
  3. 并保存历史的表达式运算记录。
  4. 前期准备:图形界面的开发,例如Microsoft Visual Studio.
  5. PS:MFC编程时用静态编译,这样编译出来的EXE文件可以独立于环境运行。

相关难点:

1.中缀表达式转换成后缀表达式:
相关链接:中缀表达式转换为后缀表达式相关知识点
2.图形界面的实现。

Day2

项目实现:

因为对c语言以及java的掌握程度一般,加上考虑到时间等因素,这次的计算器设计与实现项目我打算是基于python来实现。
python不仅是一种面向对象的、解释型的、通用的脚本编程语言,而且还是是一种简洁,容易阅读的语言。
用python写的话代码更短更简洁,他只需要调一个包再通过函数来调用即可。

Day3

用python来写这个程序的时候,我用了tkinter包,这是一个python图形开发界面的库,Tkinter 模块(Tk接口)是Python的标准Tk GUI I具包的接口.Tk 和Tkinter可以在大多数的Unix平台下使用,同样可以应用在
Windows和Macintosh系统里。Tk8 0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。

相关知识:

  • Tkinter中mainloop函数实质:
    简单点来讲,mainloop的定义是:当主窗口尚未关闭时,如果检测到事件发生,则运行关联的事件处理程序函数。
    绑定事件后,mainloop进入到到事件循环,一旦检测到事件,就刷新组件,譬如你输入一个字符,就要立即在光标那个位置显示出来。
    通俗点来说:每个部件都相当于一个连环画,而组成在一起后,mainloop就相当于翻这些连环画

  • Tkinter之pack篇
    pack是一个布局管理器,可以将它视为一个弹性容器。
    1、pack函数布局的时候,默认先使用的放到上面,然后依次向下排列,默认方式它会给我们的组件一个自认为合适的位置和大小。
    2、pack函数也可以接受几个参数,side参数,指定了它停靠在哪个方向,可以为LEFT,TOP,RIGHT,BOTTOM,分别代表左,上,右,下,
    它的fill参数可以是X,Y,BOTH,NONE即在水平方向填充,竖直方向填充,水平和竖直方向填充和不填充。
    3、它的expand参数可以是YES 和 NO,它的anchor参数可以是N,E,S,W(这里的NESW分别表示北东南西,这里分别表示上右下左)以及他们的组合或者是CENTER(表示中间)
    4、它的ipadx表示的是内边距的x方向,它的ipady表示的是内边距的y的方向,padx表示的是外边距的x方向,pady表示的是外边距的y方向。
    PS:必须强调pack()布局和控件的先后顺序是相关的

  • Tkinter组件
    Button:按钮控件;在程序中显示按钮。
    语法格式:w = Button ( master, option=value, ... )
    master:按钮的父容器
    1.activebackground
    当鼠标放上去时,按钮的背景色
    2.bd
    按钮边框的大小,默认为 2 个像素
    3.bg
    按钮的背景色
    4.fg
    按钮的前景色(按钮文本的颜色)
    5.font
    文本字体
    6.height
    按钮的高度
    7.width
    按钮的宽度,默认为适应按钮的内容
    8.anchor
    锚选项,控制文本的位置,默认为中心
    9.command
    按钮关联的函数,当按钮被点击时,执行该函数
    Entry:输入控件;用于显示简单的文本内容.
    1.bg
    输入框背景颜色
    2.bd
    边框大小
    3.cursor
    光标的形状设定
    4.fg
    文字颜色
    5.font
    文本字体
    6.selectbackground
    选中文字的背景颜色
    7.selectborderwidth
    选中文字背景边框宽度
    8.selectforeground
    选中文字颜色
    9.show
    指定文本框内容显示为字符。满足字符即可
    10.textvariable
    文本框的值,是一个StringVar()对象
    11.width
    文本框宽度
    Frame: 框架控件;在屏幕上显示一个矩形区域,多用来作为容器.
    Label:标签控件;可以显示文本和位图
    Menu:菜单控件;显示菜单栏,下拉菜单和弹出菜单.
    Text:文本控件;用于显示多行文本.

  • Tkinter几何管理
    pack(): 包装;
    grid(): 网格;
    place(): 位置;

链接:

PythonGUI编程(Tkinter)
关于tkinter的的布局管理pack()篇
Tkinter教程之Pack篇

  • Python中eval用法
    ·eval()函数用来执行一个字符串表达式,并返回表达式的值
    ·eval(expression[, globals[, locals])
    ·eval()中必须是must be a string, bytes or code object
    ·必须是str(字符串的int) (字符串的float)
x = 7
eval(3 * x’ )
21

eval(pow(2,2))#求2的2次方
4

代码实现:

import tkinter as tk

class Calculate(tk.Frame):
    def __init__(self, parent = None): #初始化方法
        """计算器构造函数"""
        tk.Frame.__init__(self, parent)
        self.pack() #将相关部件放到布局管理器中(主窗口)
        self.startOfNextOperand = True  # 开始输入下一个操作数
        #创建计算过程和结果的标签
        self.expr = tk.StringVar()# 显示输入运算表达式
        self.expr.set('')
        self.exprLabel = tk.Label(self, font = ('Helvetica', 10),
                                  fg = '#000', width = 64, anchor='w', textvariable = self.expr)
        self.exprLabel.grid(row = 0, column = 0, columnspan = 4)

        self.result = tk.StringVar()#显示输出结果
        self.result.set(0)
        self.resultLabel = tk.Label(self, font = ('Helvetica', 20),
                                    width = 34, anchor='e', textvariable=self.result)
        self.resultLabel.grid(row = 1, column = 0, columnspan = 4)

        # 创建计算器按钮的列表组件,使用二维列表表示
        buttons = [[ 'CE', 'C', '←', '/'],
                   ['7', '8', '9', '×'],
                   ['4', '5', '6', '-'],
                   ['1', '2', '3', '+'],
                   ['±', '0', '.', '=']]

        # 创建和布局各个按钮
        for r in range(5):
            for c in range(4):
                # 定义事件处理函数cmd(),默认参数为按钮标签buttons[r][c]
                def cmd(key = buttons[r][c]):
                    self.click(key)
                if(r == 0 or c == 3):
                    button = tk.Button(self, text = buttons[r][c], bg = '#008c8c', fg = '#000',
                              width=16, font = ('Helvetica', 16), command = cmd)
                else:
                    button = tk.Button(self, text = buttons[r][c], bg = '#fff', fg = '#666',
                              width=16, font = ('Helvetica', 16), command = cmd)
                button.grid(row = r+2, column = c) #前两行用于结果显示,按钮从第三行开始

    def click(self, key):
        if key == '=':   #按等号键时, 求值, 并显示结果
            resultExpr = self.expr.get() + self.result.get()
            resultNum=eval(resultExpr)
            self.result.set(resultNum)
            self.expr.set('')
            self.startOfNextOperand = True
        elif key in '+ - / ×':
            if key == '×': key = '*'
            resultExpr = self.expr.get() + self.result.get() + key
            self.expr.set(resultExpr)
            # self.result.set(0)
            self.startOfNextOperand = True
        elif key == 'C':  # 全部清空, 回到初始状态
            self.expr.set('')
            self.result.set(0)
        elif key == 'CE':  # 清空当前输入
            self.result.set(0)
        elif key == '←':
            oldnum = self.result.get()
            if len(oldnum) == 1: # 只有一个字符
                newnum = 0
            else:
                newnum = oldnum[:-1]
            self.result.set(newnum)
        elif key == '±':  # 正负号,切换正负号
            oldnum = self.result.get()  # 获取原来的值
            if oldnum[0] == '-':
                newnum = oldnum[1:] #如果是复数的话从第一个开始取
            else:
                newnum = '-' + oldnum#如果是正数的话前面加上负号
            self.result.set(newnum)
        else: # 按数字或者小数点键
            if self.startOfNextOperand:
                self.result.set(0)
                self.startOfNextOperand = False #使得输出结果不会叠加占用,如果为True的话
            oldnum = self.result.get()  # 获取原来的值
            if oldnum == '0':
                self.result.set(key)
            else:
                newnum = oldnum + key
                self.result.set(newnum)

if __name__ == '__main__':
    root = tk.Tk() #创建窗口对象
    root.title('简易计算器')
    calculate = Calculate(root) #创建类的实例化
    root.mainloop() #进入到事件循环

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咸鱼Linux运维

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

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

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

打赏作者

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

抵扣说明:

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

余额充值