(Python)计算器的设计与实现

实验一 计算器的设计与实现

一、实验目的与要求
实验目的:锻炼可视化编程能力。
实验要求:

  1. 熟悉VC++、Visual Studio C#或者Java编程环境。
  2. 运用面向对象程序设计知识对实验题目进行分析和设计。
  3. 进行程序编写和调试工作。

二、实验内容
使用MFC框架在Visual Studio 6.0环境下(也可使用Visual Studio c#或者Java编程环境)编写一个简易的计算器,能实现简单的加、减、乘、除四则运算,并加入特定的一些效果,如使计算器的颜色在红色,绿色和蓝色之间轮流变换等。完成诸如计算器对话框的创建、控件编辑、界面设计、关键功能的实现等工作。

三、实验设计
本次计算机设计实验采用python编程环境,设计分为两部分:
1)计算的实现 2)计算机可视化界面的实现
计算部分,采用python中自带的eval()函数为核心算法,原因在于eval()函数可以直接对输入其中的字符串进行计算,确保输入的字符串可计算即可,又采用try-except格式语句,对不能计算的情况进行处理,使其返回ERROR!
可视化界面设计部分,调用tkinter模块,内置多项可视化组件,其中包括文本输入框(Entry)、按钮组件(Button)、框架(Frame)、标签(Label)等等,引入各个组件并通过布局函数pack()逐次调整位置,令其尽量美观。大小方面使用expand=YES命令使用户可以自由调整大小。计算器颜色方面以下程序中提供了三种颜色可供选择,使用时选择#style.configure 。。。。。的其中一个语句,将#(注释符)去掉即可。
代码量部分,采用python编程环境代码量较少,仅50行(含注释),也更美观。

四、核心程序代码

from tkinter import *
from tkinter.ttk import *
#将Frame的共同属性作为默认值,方便创建
def my_frame(master):
    w=Frame(master)
    w.pack(side=TOP,expand=YES,fill=BOTH)#expand控制fill开关,fill为X、Y、BOTH
    return w
#将Button的共同属性作为默认,方便创建
def my_Button(master,text,command):
    w=Button(master,text=text,command=command,width=5)
    w.pack(side=LEFT,expand=YES,fill=BOTH,padx=2,pady=2) #padx、pady设置按钮所占空间格大小
    return w
#退格键功能设置,将数字串最末字符删除并返回
def back(text):
    if len(text)>0:
        return text[:-1]
    else:
        return text
#利用eval函数计算表达式的值
def calc(text):
    try:
        return eval(text)   #此处为计算器的计算语句,简单粗暴
    except (SyntaxError,ZeroDivisionError,NameError):
        return 'ERROR!'
#计算器界面实现
wind=Tk()
wind.title('Demut-Calculator')  #标题
text=StringVar()
#创建文本框
Entry(wind,textvariable=text).pack(expand=YES,fill=BOTH,padx=3,pady=4)
#创建ttk子模块的Style对象,设置按钮内边距及颜色
style=Style()
#style.configure('TButton',padding=3,background="#00FFFF",foreground="#008B8B")
#style.configure('TButton',padding=3,background="#00FFFF",foreground="#87CEFA")
style.configure('TButton',padding=3,background="#87CEFA",foreground="#DA70D6")
#创建第一行三个按钮
my1=my_frame(wind)
Label(my_Button(my1,'Backspace',lambda t=text:t.set(back(t.get()))),style="TButton")
Label(my_Button(my1,'Clear',lambda t=text:t.set('')),style="TButton")
Label(my_Button(my1,'Inverse',lambda t=text:t.set('-('+t.get()+')')),style="TButton")
#创建其余四行
for key in ('789/','456*','123-','0.=+'):
    my2=my_frame(wind)
    for ch in key:
        if ch =='=':
            Label(my_Button(my2,ch,lambda t=text:t.set(calc(t.get()))),style="TButton")
        else:
            Label(my_Button(my2,ch,lambda t=text,c=ch:t.set(t.get()+c)),style="TButton")

wind.mainloop()

五、实验结果
1)测试一:(验证+ - * / 的运算)
测试语句为:2+3*2+6/3
测试结果如下:
运行前:

运行后:

2)测试二: (验证带小数点的运算)
测试语句为:1.5+3.5
测试结果如下:
运行前:

运行后:

3)测试三: (验证带‘取负数操作’的运算)
测试语句为:2+2 之后对其取负数,再+1
测试过程:
取反前:

取反后:(点击inverse按钮后)

+1 运算:

测试结果:

4)测试四: (验证Backspace操作)
测试语句: 123 Backspace
测试结果:
运行前:

运行后:

5)测试五: (验证clear操作)
测试语句: 123 Clear
测试结果:
运行前:

运行后:

6)测试六: (验证非法语句的运算)
测试语句: 1+5*
测试结果:
运行前:

运行后:

7)测试七: (颜色变化)
测试结果:

六、实验总结
初次接触可视化界面的程序设计,选用python编程环境,在计算方面占有很大的优势,可以不用处理各个运算符的优先级顺序,但在界面设计部分需要注意很多因素,包括按钮的内外边距、文本框组件的布局位置、按钮背后的函数传参问题、非法语句的运算处理等等,因此此次实验有效锻炼了使用python处理问题的能力,在查找以及使用各个模块的同时,提高了代码的阅读效率以及利用率,在可视化部分自己有一个显著的提高。
另需特别声明:由于自身软件问题(pycharm),缺乏相应的bg颜色更改功能,按钮的背景颜色更改在代码中虽有体现,在此软件上确无法得到体现,而前景颜色可以展现出来,因此我保留了背景颜色更改语句,如有需要可运行查看。

发布了32 篇原创文章 · 获赞 39 · 访问量 1751

猜你喜欢

转载自blog.csdn.net/qq_44958172/article/details/103150973