用python的tkinter库实现简易计算器

文章目录

  • 结果展示
  • PSP表格
  • 核心代码
  • 设计过程
  • 改进方案
  • 单元测试
  • 实验心得

作业要求

作业查看链接

项目源码

源代码如下:

import tkinter as tk

'''布局'''

#初始界面定义
root = tk.Tk()
root.title('简易计算器')
root.geometry('350x460+130+130')

root.attributes("-alpha", 0.95)
root["background"] = "#fffaf0"
font=('宋体',20)
font_16=('宋体',16)


#对0排版
result_num = tk.StringVar()
result_num.set('')

tk.Label(root,textvariable=result_num,font=font,height=4,width=20,justify=tk.LEFT,anchor=tk.SE).grid(row=1,column=1,columnspan=4)

#第一行按键
button_clear = tk.Button(root,text='C',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_back = tk.Button(root,text='←',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_pingfang = tk.Button(root,text='^',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_genhao = tk.Button(root,text='√',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_clear.grid(row=2,column=1,padx=3,pady=2)
button_back.grid(row=2,column=2,padx=3,pady=2)
button_pingfang.grid(row=2,column=3,padx=3,pady=2)
button_genhao.grid(row=2,column=4,padx=3,pady=2)

#第二行按键
button_leftkuo = tk.Button(root,text='(',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_rightkuo = tk.Button(root,text=')',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_division = tk.Button(root,text='/',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_mutiplication = tk.Button(root,text='*',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_leftkuo.grid(row=3,column=1,padx=3,pady=2)
button_rightkuo.grid(row=3,column=2,padx=3,pady=2)
button_division.grid(row=3,column=3,padx=3,pady=2)
button_mutiplication.grid(row=3,column=4,padx=3,pady=2)

#第三行按键
button_seven = tk.Button(root,text='7',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_eight = tk.Button(root,text='8',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_nine = tk.Button(root,text='9',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_add = tk.Button(root,text='+',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_seven.grid(row=4,column=1,padx=3,pady=2)
button_eight.grid(row=4,column=2,padx=3,pady=2)
button_nine.grid(row=4,column=3,padx=3,pady=2)
button_add.grid(row=4,column=4,padx=3,pady=2)

#第四行按键
button_four = tk.Button(root,text='4',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_five = tk.Button(root,text='5',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_six = tk.Button(root,text='6',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_sub = tk.Button(root,text='-',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_four.grid(row=5,column=1,padx=3,pady=2)
button_five.grid(row=5,column=2,padx=3,pady=2)
button_six.grid(row=5,column=3,padx=3,pady=2)
button_sub.grid(row=5,column=4,padx=3,pady=2)

#第四行按键
button_one = tk.Button(root,text='1',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_two = tk.Button(root,text='2',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_three = tk.Button(root,text='3',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_equal = tk.Button(root,text='=',width=5,height=3,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_one.grid(row=6,column=1,padx=3,pady=2)
button_two.grid(row=6,column=2,padx=3,pady=2)
button_three.grid(row=6,column=3,padx=3,pady=2)
button_equal.grid(row=6,column=4,padx=3,pady=2,rowspan=2)

#第五行按键
button_zero = tk.Button(root,text='0',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_douhao = tk.Button(root,text=',',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_dot = tk.Button(root,text='.',width=5,font=font_16, relief=tk.FLAT,bg='#ffe4e1')
button_zero.grid(row=7,column=1,padx=3,pady=2)
button_dot.grid(row=7,column=2,padx=3,pady=2)
button_douhao.grid(row=7,column=3,padx=3,pady=2)
'''点击事件'''
def click_button(x):
    result_num.set(result_num.get() + x)

def calculation():
    opt_str = result_num.get()
    result = eval(opt_str)
    result_num.set(str(result))

def deback():
    i = 0
    str2=''
    list1=list(result_num.get())
    len1=len(list1)-1
    for i in range(len1):
        str2=str2+str(list1[i])
    result_num.set(str2)

def delete():
    result_num.set('')

button_one.config(command=lambda :click_button('1'))
button_two.config(command=lambda :click_button('2'))
button_three.config(command=lambda :click_button('3'))
button_four.config(command=lambda :click_button('4'))
button_five.config(command=lambda :click_button('5'))
button_six.config(command=lambda :click_button('6'))
button_seven.config(command=lambda :click_button('7'))
button_eight.config(command=lambda :click_button('8'))
button_nine.config(command=lambda :click_button('9'))
button_zero.config(command=lambda :click_button('0'))
button_add.config(command=lambda :click_button('+'))
button_sub.config(command=lambda :click_button('-'))
button_pingfang.config(command=lambda :click_button('**'))
button_genhao.config(command=lambda :click_button('pow('))
button_leftkuo.config(command=lambda :click_button('('))
button_rightkuo.config(command=lambda :click_button(')'))
button_mutiplication.config(command=lambda :click_button('*'))
button_division.config(command=lambda :click_button('/'))
button_dot.config(command=lambda :click_button('.'))
button_douhao.config(command=lambda :click_button(','))

button_equal.config(command=calculation)
button_clear.config(command=delete)
button_back.config(command=deback)

root.mainloop()

0.界面及功能展示

简易计算器功能展示

目前本人能力只够做简易计算器

1.PSP表格

步骤预估耗时(min)实际耗时(min)
设计思考2030
布局开发5060
逻辑开发4060
实际编码200250
实例检测3025
改进方案100120

2.解题思路

1.编程语言选择与界面:
python在GUI图形用户界面的开发方面提供了丰富的库支持,例如tkinter,PyQt等等,为用户开发提供便利,利用python的tkinter库,利用其grid等布局管理器来实现布局的工整性

2.核心功能:
Python是一门通用编程语言,可以轻松处理计算器的核心功能,包括接收用户输入、执行计算、显示结果等,使用Python来实现基本的四则运算以及科学计算功能,如开方、取余、幂运算等,非常方便,Python的字符串处理功能强大,可以轻松处理用户输入的表达式,进行计算,并生成结果,这里由于个人能力有限并不能很好的复现计算器的全部功能

3.核心代码

对初始输入的数字排版,使其显示在右下角并按序输出

result_num = tk.StringVar()
result_num.set('')

tk.Label(root,textvariable=result_num,font=font,height=4,width=20,justify=tk.LEFT,anchor=tk.SE).grid(row=1,column=1,columnspan=4)

对字符串的具体处理,包括back删去一个字符以免用户清空所有元素的麻烦,点击等号自动读取并执行计算

'''点击事件'''
def click_button(x):
    result_num.set(result_num.get() + x)

def calculation():
    opt_str = result_num.get()
    result = eval(opt_str)
    result_num.set(str(result))

def deback():
    i = 0
    str2=''
    list1=list(result_num.get())
    len1=len(list1)-1
    for i in range(len1):
        str2=str2+str(list1[i])
    result_num.set(str2)

def delete():
    result_num.set('')

4.设计过程

导入tkinter库,通过定义一个名为Calculator的类,实现了计算器的功能和界面。用tk.Button功能实现对按键位置大小等参数信息的调整,通过grid操作实现按键位置间隔的排版,例如:

button_clear = tk.Button(root,text='C',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_back = tk.Button(root,text='←',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_pingfang = tk.Button(root,text='^',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_genhao = tk.Button(root,text='√',width=5,font=font_16, relief=tk.FLAT,bg='#b1b2b2')
button_clear.grid(row=2,column=1,padx=3,pady=2)
button_back.grid(row=2,column=2,padx=3,pady=2)
button_pingfang.grid(row=2,column=3,padx=3,pady=2)
button_genhao.grid(row=2,column=4,padx=3,pady=2)

通过config操作引用函数实现具体计算功能,例如:

button_division.config(command=lambda :click_button('/'))
button_dot.config(command=lambda :click_button('.'))
button_douhao.config(command=lambda :click_button(','))

button_equal.config(command=calculation)
button_clear.config(command=delete)
button_back.config(command=deback)

而核心区代码已经展示如上,这里不再赘述

5.性能改进方案:

1.加入try…except块捕获可能的异常,提高检验性和修改方便度
2.导入math库以实现一些比较常见的数学功能,例如sin,cos等
3.结果一致保留定长浮点数以加强精确性和可读性
4.对于按键等布局的精细化处理

6.单元测试

对计算器的部分运算进行测试

测试代码

import unittest
import tkinter as tk
from tkinter import Entry, Button

# 导入你的应用主文件中的函数或类,这里是一个假设的导入方式
# from your_application import click_button, calculation, deback, delete

class TestCalculator(unittest.TestCase):
    def setUp(self):
        self.root = tk.Tk()
        self.entry = Entry(self.root, textvariable=tk.StringVar())
        self.entry.grid(row=1, column=1)
        self.app = Application(self.root, self.entry)  # 假设你有一个Application类

    def test_addition(self):
        self.app.click_button('1')
        self.app.click_button('+')
        self.app.click_button('2')
        self.app.calculation()
        self.assertEqual(self.app.result_num.get(), '3')  # 检查是否正确计算

    def test_subtraction(self):
        self.app.click_button('5')
        self.app.click_button('-')
        self.app.click_button('3')
        self.app.calculation()
        self.assertEqual(self.app.result_num.get(), '2')  # 检查是否正确计算

    # 继续编写其他测试用例,覆盖更多功能

    def tearDown(self):
        self.root.destroy()

if __name__ == '__main__':
    unittest.main()

7.实验心得

通过本次实验,我熟悉了python利用tkinter库来进行图形布局和逻辑编写,对初步开发有了一定的理解,这次计算器的功能还没有开发的很好,但是我会在未来继续做出改进

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个使用tkinter编写的简易计算器的示例代码: ```python import tkinter as tk class Calculator: def __init__(self, master): self.master = master master.title("简易计算器") # 创建输入框 self.entry = tk.Entry(master, width=30, justify="right") self.entry.grid(row=0, column=0, columnspan=4, padx=5, pady=5) # 定义数字按钮 numbers = ["7", "8", "9", "4", "5", "6", "1", "2", "3", "0"] # 创建数字按钮 for i, number in enumerate(numbers): button = tk.Button(master, text=number, width=7, height=3, command=lambda num=number: self.click(num)) button.grid(row=i//3+1, column=i%3, padx=5, pady=5) # 创建运算符按钮 operators = ["+", "-", "*", "/", "C", "=", "(", ")"] for i, operator in enumerate(operators): button = tk.Button(master, text=operator, width=7, height=3, command=lambda op=operator: self.click(op)) button.grid(row=i//2+1, column=i%2+3, padx=5, pady=5) def click(self, key): if key == "C": self.entry.delete(0, tk.END) elif key == "=": try: result = eval(self.entry.get()) self.entry.delete(0, tk.END) self.entry.insert(0, result) except: self.entry.delete(0, tk.END) self.entry.insert(0, "错误") else: self.entry.insert(tk.END, key) root = tk.Tk() my_calculator = Calculator(root) root.mainloop() ``` 这个示例代码创建了一个名为Calculator的类,它继承自tkinter的Frame类。类的构造函数中创建了一个输入框和数字、运算符按钮,并为每个按钮添加了响应函数。在响应函数中,当用户按下数字或运算符按钮时,会向输入框中插入相应的数字或运算符;当用户按下“C”清除按钮时,会清空输入框;当用户按下“=”等于按钮时,会计算输入框中的表达式并显示结果,如果计算过程中出现错误,则在输入框中显示“错误”。 你可以将这段代码保存为一个.py文件并运行它,就可以看到一个简单的计算器界面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值