Python综合案例—利用tkinter实现计算器的程序
目录
一、导入 tkinter 库
定义全局变量
二、定义回调函数
三、创建窗口对象
四、创建标签控件
五、创建数字按钮
六、创建加、减、乘、除和等于按钮
七、创建清空按钮
八、总结
用Python实现计算器可以让我们更好地理解面向对象编程、GUI 编程和事件驱动编程等概念,并掌握 Python 语言的基本语法和常用库。同时,计算器是一种常见的应用程序,实现它不仅可以提高我们的编程技能,还可以方便我们平时进行简单的计算。
在编写计算器程序的过程中,我们需要考虑很多问题,如如何设计 GUI 界面、如何处理用户输入、如何进行数值计算等等。这些问题都是实际编写应用程序时必须面对的,因此通过实现计算器程序,我们可以更好地了解实际软件开发中的问题和解决方法。

用Python实现计算器的过程包括以下步骤:
导入所需库:我们需要使用 tkinter 库来创建 GUI 界面,并使用 eval 函数来进行数值计算。
创建 GUI 界面:使用 tkinter 库来创建一个窗口,并在窗口中添加数字按钮、运算符按钮和其他功能按钮,如清除按钮、等于按钮等。同时,也需要在界面上创建一个文本框来显示用户输入和计算结果。
处理用户输入:通过绑定按钮事件和键盘事件来处理用户对按钮的单击和键盘的输入。当用户单击数字按钮时,将数字添加到文本框中;当用户单击运算符按钮时,将操作符添加到文本框中。同时也需要处理删除字符和清空文本框等操作。
进行数值计算:当用户单击等于按钮时,使用 eval 函数来计算文本框中的表达式,并将结果显示在文本框中。
完善程序功能:根据需求可以增加其他功能,如添加小数点、处理错误输入、防止除零等。
一、导入 tkinter 库
在 Python 中,使用 import 语句可以导入其他模块或库。在这个程序中,我们首先需要导入 tkinter 库,以便创建 GUI 界面。具体的语句如下:
import tkinter as tk
这里我们将 tkinter 库重命名为 tk,以便在后面的代码中更方便地使用。
定义全局变量
在计算器程序中,我们需要保存当前输入的数字和运算符,以便进行计算。因此,我们在程序一开始就要定义一些变量来保存这些值。具体的变量有 num1、num2 和 operator,它们分别表示当前输入的第一个数字、第二个数字和运算符,初始值均为空字符串。此外,由于这些变量需要在多个函数中使用,因此我们将它们定义为全局变量。具体的语句如下:
# 定义全局变量,用于保存当前输入的数字和运算符
num1 = ''
num2 = ''
operator = ''
二、定义回调函数
在 GUI 界面中,按钮、菜单等控件被点击时会触发相应的事件,我们需要编写回调函数来处理这些事件。在这个程序中,我们需要编写三个回调函数,分别用于将数字、运算符和等于号添加到显示屏上,具体的函数如下:
-
add_digit(digit):该函数用于将数字添加到显示屏上。它的参数digit表示当前点击的数字,函数会将该数字添加到num1或num2变量中,并更新显示屏的内容。如果当前没有输入运算符,则数字会被添加到num1中;否则,数字会被添加到num2中。具体的代码如下:
-
def add_digit(digit):global num1, num2, operatorif operator == '':num1 += str(digit)label.config(text=num1)else:num2 += str(digit)label.config(text=num2) -
add_operator(op):该函数用于将运算符添加到显示屏上。它的参数op表示当前点击的运算符。函数会将该运算符添加到operator变量中,并更新显示屏的内容。如果num1不为空,则运算符会被添加到num1后面;否则,运算符不会被添加到显示屏上。具体的代码如下: -
def add_operator(op):global num1, num2, operatorif num1 != '' and num2 == '':operator = oplabel.config(text=num1 + operator) -
calculate():该函数用于计算结果。它会根据当前缓存的数字和运算符计算结果,并更新显示屏的内容。具体的代码如下:
-
def calculate():global num1, num2, operatorif num1 != '' and num2 != '' and operator != '':num1 = str(eval(num1 + operator + num2))num2 = ''operator = ''label.config(text=num1)在计算过程中,我们使用了 Python 内置的
eval()函数,该函数可以将字符串作为代码执行,并返回结果。这里我们将缓存的数字和运算符拼接成一个字符串,并将其传递给eval()函数进行计算。
三、创建窗口对象
在 tkinter 中,创建一个窗口对象需要使用 Tk() 构造函数。在这个程序中,我们使用该函数创建了一个名为 window 的窗口对象,并设置了窗口标题为 Calculator。具体的代码如下:
# 创建一个名为 window 的窗口对象
window = tk.Tk()# 设置窗口标题
window.title('Calculator')
四、创建标签控件
在 tkinter 中,创建一个标签控件需要使用 Label() 构造函数。在这个程序中,我们使用该函数创建了一个名为 label 的标签控件,并设置了其字体、宽度、高度、背景色和文本对齐方式等属性。同时,我们将该标签控件放置在窗口中央,使用 grid() 方法指定其行列号和边距等参数。具体的代码如下:
# 创建一个标签对象,用于显示计算结果
label = tk.Label(window, text='0', font=('Arial', 20), width=15, height=2, bg='white', anchor='e')# 将标签对象放置在窗口中央
label.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
在这里,row=0 和 column=0 表示该控件位于第 1 行、第 1 列,columnspan=4 表示该控件跨越了 4 列(即占据整个顶部),padx=10 和 pady=10 表示控件边缘和窗口边框之间的水平和垂直间距均为 10。
五、创建数字按钮
在 tkinter 中,创建一个按钮控件需要使用 Button() 构造函数。在这个程序中,我们使用循环语句创建了数字按钮,并设置了其文本、字体、宽度、高度和回调函数等属性。同时,我们使用 grid() 方法指定了按钮的行列号和边距等参数,将其放置在窗口中间。具体的代码如下:
# 创建数字按钮并绑定回调函数
for i in range(1, 10):btn = tk.Button(window, text=str(i), font=('Arial', 20), width=3, height=2, command=lambda digit=i:add_digit(digit))btn.grid(row=(i-1)//3+1, column=(i-1)%3, padx=5, pady=5)
在这里,range(1, 10) 表示数字按钮的取值范围,循环变量 i 依次取值 1 到 9。text=str(i) 表示按钮的文本为当前的数字;font=('Arial', 20) 表示按钮的字体为 Arial,大小为 20;width=3 和 height=2 表示按钮的宽度和高度;command=lambda digit=i:add_digit(digit) 表示按钮被点击后会调用 add_digit() 函数,并将当前的数字作为参数传递给该函数。在 grid() 方法中,row=(i-1)//3+1 和 column=(i-1)%3 表示按钮的行列号,padx=5 和 pady=5 表示控件边缘和窗口边框之间的水平和垂直间距均为 5。
六、创建加、减、乘、除和等于按钮
在 tkinter 中,创建一个按钮控件需要使用 Button() 构造函数。在这个程序中,我们使用该函数创建了加、减、乘、除和等于按钮,并设置了其文本、字体、宽度、高度和回调函数等属性。同时,我们使用 grid() 方法指定了按钮的行列号和边距等参数,将其放置在窗口中间。具体的代码如下:
# 创建加、减、乘、除、等于按钮并绑定回调函数
btn_add = tk.Button(window, text='+', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('+'))
btn_sub = tk.Button(window, text='-', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('-'))
btn_mul = tk.Button(window, text='*', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('*'))
btn_div = tk.Button(window, text='/', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('/'))
btn_eq = tk.Button(window, text='=', font=('Arial', 20), width=3, height=2, command=calculate)# 将按钮对象放置在窗口中间
btn_add.grid(row=1, column=3, padx=5, pady=5)
btn_sub.grid(row=2, column=3, padx=5, pady=5)
btn_mul.grid(row=3, column=3, padx=5, pady=5)
btn_div.grid(row=4, column=3, padx=5, pady=5)
btn_eq.grid(row=4, column=2, padx=5, pady=5)
在这里,text='+'、text='-'、text='*' 和 text='/' 表示加、减、乘、除按钮的文本,text='=' 表示等于按钮的文本;font=('Arial', 20) 表示按钮的字体为 Arial,大小为 20;width=3 和 height=2 表示按钮的宽度和高度;command=lambda:add_operator('+')、command=lambda:add_operator('-')、command=lambda:add_operator('*') 和 command=lambda:add_operator('/') 表示分别将加、减、乘、除按钮的回调函数设置为 add_operator() 函数,并将相应的运算符作为参数传递给该函数;command=calculate 表示将等于按钮的回调函数设置为 calculate() 函数。在 grid() 方法中,row 和 column 表示按钮的行列号,padx 和 pady 表示控件边缘和窗口边框之间的水平和垂直间距。
七、创建清空按钮
在 tkinter 中,创建一个按钮控件需要使用 Button() 构造函数。在这个程序中,我们使用该函数创建了一个名为 btn_clear 的清空按钮,并设置了其文本、字体、宽度、高度和回调函数等属性。同时,我们使用 grid() 方法指定了按钮的行列号和边距等参数,将其放置在窗口底部。具体的代码如下:
# 创建清空按钮并绑定回调函数
btn_clear = tk.Button(window, text='C', font=('Arial', 20), width=3, height=2, command=lambda:clear())
btn_clear.grid(row=4, column=0, padx=
八、总结
这个程序使用了 tkinter 库来创建 GUI 界面。它创建一个名为 window 的窗口,并在窗口中央创建了一个标签,用于显示计算结果。然后,它使用循环语句创建了数字按钮,并绑定了回调函数add_digit(),用于将数字添加到显示屏上;使用按钮对象创建了加、减、乘、除、等于按钮,并绑定了回调函数 add_operator() 和 calculate(),分别用于将运算符添加到显示屏上和计算结果;最后,在底部创建了一个清空按钮,并绑定了回调函数 clear(),用于清空显示屏和缓存的数字和运算符。
当用户点击数字按钮时,会调用 add_digit() 函数,该函数会将数字添加到 num1 或 num2 变量中,并更新显示屏的内容。当用户点击加、减、乘、除按钮时,会调用 add_operator() 函数,该函数会将运算符添加到 operator 变量中,并更新显示屏的内容。当用户点击等于按钮时,会调用 calculate() 函数,该函数会根据当前缓存的数字和运算符计算结果,并更新显示屏的内容。最后,当用户点击清空按钮时,会调用 clear() 函数,该函数会清空显示屏和缓存的数字和运算符。
完整代码:
import tkinter as tk# 定义全局变量,用于保存当前输入的数字和运算符
num1 = ''
num2 = ''
operator = ''# 定义一个函数,用于将数字添加到显示屏上
def add_digit(digit):global num1, num2, operatorif operator == '':num1 += str(digit)label.config(text=num1)else:num2 += str(digit)label.config(text=num2)# 定义一个函数,用于将运算符添加到显示屏上
def add_operator(op):global num1, num2, operatorif num1 != '' and num2 == '':operator = oplabel.config(text=num1 + operator)# 定义一个函数,用于计算结果
def calculate():global num1, num2, operatorif num1 != '' and num2 != '' and operator != '':num1 = str(eval(num1 + operator + num2))num2 = ''operator = ''label.config(text=num1)# 创建一个名为 window 的窗口对象
window = tk.Tk()# 设置窗口标题
window.title('Calculator')# 创建一个标签对象,用于显示计算结果
label = tk.Label(window, text='0', font=('Arial', 20), width=15, height=2, bg='white', anchor='e')# 将标签对象放置在窗口中央
label.grid(row=0, column=0, columnspan=4, padx=10, pady=10)# 创建数字按钮并绑定回调函数
for i in range(1, 10):btn = tk.Button(window, text=str(i), font=('Arial', 20), width=3, height=2, command=lambda digit=i:add_digit(digit))btn.grid(row=(i-1)//3+1, column=(i-1)%3, padx=5, pady=5)# 创建加、减、乘、除、等于按钮并绑定回调函数
btn_add = tk.Button(window, text='+', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('+'))
btn_sub = tk.Button(window, text='-', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('-'))
btn_mul = tk.Button(window, text='*', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('*'))
btn_div = tk.Button(window, text='/', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('/'))
btn_eq = tk.Button(window, text='=', font=('Arial', 20), width=3, height=2, command=calculate)# 将按钮对象放置在窗口中间
btn_add.grid(row=1, column=3, padx=5, pady=5)
btn_sub.grid(row=2, column=3, padx=5, pady=5)
btn_mul.grid(row=3, column=3, padx=5, pady=5)
btn_div.grid(row=4, column=3, padx=5, pady=5)
btn_eq.grid(row=4, column=2, padx=5, pady=5)# 创建清空按钮并绑定回调函数
btn_clear = tk.Button(window, text='C', font=('Arial', 20), width=3, height=2, command=lambda:clear())
btn_clear.grid(row=4, column=0, padx=5, pady=5)# 定义一个函数,用于清空显示屏和缓存的数字和运算符
def clear():global num1, num2, operatornum1 = ''num2 = ''operator = ''label.config(text='0')# 进入主消息循环
window.mainloop()
相关文章:
Python综合案例—利用tkinter实现计算器的程序
目录 一、导入 tkinter 库 定义全局变量 二、定义回调函数 三、创建窗口对象 四、创建标签控件 五、创建数字按钮 六、创建加、减、乘、除和等于按钮 七、创建清空按钮 八、总结 用Python实现计算器可以让我们更好地理解面向对象编程、GUI 编程和事件驱动编程等概念&a…...
canvas学习笔记
其实还有react还没有学,但是公司技术栈里面有canvas,所以先系统学习一下canvas 一、canvas 简介 <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为 JavaScript) 在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也…...
Navicat Premium 15安装注教程
Navicat Premium 15安装 准备工作 下载好安装包navicat150_premium_cs_x64和安装完成Navicat Premium 15 链接:https://pan.baidu.com/s/1TJs3pjAXJXhu7-13DJLzpg 提取码:hunk 安装Navicat Premium 15 无脑操作,下一步下一步就行了&…...
yolo v8
这个系列代码被封装的非常的精致,对二次开发不太友好,虽然也还是可以做些调节 模型的导出 有三种方式试过,都可以导出onnx的模型 1. 用yolov8 源码来自:ultralytics\yolo\engine\exporter.py (不固定尺寸) yolo export modelpa…...
2022IDEA的下载、安装、配置与使用
文章目录 1.IntelliJ IDEA 介绍1.2 JetBrains 公司介绍1.2 IntelliJ IDEA 介绍1.3 IDEA 的主要功能介绍1.3.1 语言支持上1.3.2 其他支持 1.4 IDEA 的主要优势:(相较于 Eclipse 而言)1.5 IDEA 的下载地址1.6 官网提供的详细使用文档 2.windows 下安装过程2.1 安装前的…...
实验十 超市订单管理系统综合实验
实验十 超市订单管理系统综合实验 应粉丝要求,本博主帮助实现基本效果! 未避免产生版权问题,本项目博主不公开源码,如果您遇到相关问题可私聊博主! 一、实验目的及任务 通过该实验,掌握利用SSM框架进行系…...
微服架构基础设施环境平台搭建 -(二)Docker私有仓库Harbor服务搭建
微服架构基础设施环境平台搭建 -(二)Docker私有仓库Harbor服务搭建 通过采用微服相关架构构建一套以KubernetesDocker为自动化运维基础平台,以微服务为服务中心,在此基础之上构建业务中台,并通过Jekins自动构建、编译、…...
springboot+freemarker+restful
什么是freemarker? FreeMarker是一种模板引擎,它可以用于生成各种类型的文档,比如HTML、XML、PDF、Word等。它可以通过简单的模板语法和数据模型来生成文档内容。与传统的JSP相比,FreeMarker的语法更加简洁和易读,并且可以很好地…...
基于Kubernetes集群构建大中型企业CICD应用平台(1)-- devOps
一、DevOps介绍 软件开发最开始是由两个团队组成: 开发计划由开发团队从头开始设计和整体系统的构建。需要系统不停的迭代更新。 运维团队将开发团队的Code进行测试后部署上线。希望系统稳定安全运行。 这看似两个目标不同的团队需要协同完成一个软件的开发。 …...
什么是模型鲁棒性和泛化能力
目录 1、鲁棒性 2、泛化能力 1、鲁棒性 定义:在统计学领域和机器学习领域,对异常值也能保持稳定、可靠的性质,称为鲁棒性。比如说,计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃&a…...
AI翻译工具分享
LanguageX简介 冠军翻译引擎交互式翻译,为专业译者而生的新一代译者工具 自2017年神经网络机器翻译流行以来,“机器翻译替代人工翻译”的观点屡见不鲜。作为一个技术和语言背景结合的团队,LanguageX认为语言服务是高度复杂、需要创意的智力活动,并肩负着人类沟通的重要使命。La…...
选男友最好的方式就是爬山
爬山,作为一种户外运动,一直备受青睐,拥有着许多的好处。而对于现代人来说,选择一位合适的伴侣,也是一件非常重要的事情。 那么,为什么不将两者结合起来,用爬山来寻找最合适的男友呢?…...
C++面经:初始化全局变量和未初始化全局变量有什么区别
全局变量初始化而且初始值不为0,那么这样的全局变量是放在内存的.data段的,如果全局变量初始值为0或者未初始化,那么这样的全局变量是放在.bss段的。 考点: 考察C/C语言内存模型,.data,.bss段存放的内容。 …...
vue-2 指令:
指令 什么是html属性:就是用来扩展html标签的功能,属性是写在html的开发标签中:属性“属性值”, 指令就是用来扩展在vue中标签的功能 {{}} :模板语法,文本插值 不可解析html标签 {{ 可以写变量&#x…...
非常提效的7款原型工具推荐
原型图工具允许在开发前进行测试和迭代过程,可以帮助节省大量的开发时间和成本。在本文中,我们盘点了7个易于使用的原型图工具,以提高您的生产力! 1.即时设计 即时设计是一款免费的在线 UI 设计工具,无系统限制&…...
最新Kafka和RabbitMQ消息队列经典面试题汇总(含答案)
最新Kafka和RabbitMQ消息队列经典面试题汇总 1.消息队列的应用场景有哪些?2.RabbitMQ 有哪些优点?3.RabbitMQ 有哪些重要的角色?4.RabbitMQ 有哪些重要的组件?它们有什么作用?5.什么是消息持久化?6.RabbitMQ 要实现消息持久化,需要满足哪些条件?7.消息持久化有哪些缺点…...
软件测试行业对新人友好吗?
软件测试真的算是对新人小白非常友好的学科了,但是你也千万不要抱有幻想,觉得轻轻松松就能掌握真正的技能,然后如愿找到高薪工作。从0到1还是需要一个过程的,也是需要你付出相当大的努力去学习的 随着人工智能时代的到来…...
Python requests 模块
Python中的requests模块是一个HTTP客户端库,它允许您向任何Web服务器发送HTTP请求并获取响应。 下面是一个简单的示例,向某个网站发送一个HTTP GET请求: python import requests response requests.get("http://www.example.com&quo…...
IOC理论推导
1.UserDao接口 package com.kuang.dao;public interface UserDao {void getUser(); }2.UserDaoImpl业务接口 package com.kuang.dao;public class UserDaoImpl implements UserDao{Overridepublic void getUser() {System.out.println("默认获取用户数据");} }3.Us…...
我的一些感悟
记录一些感悟,不定时更新 当面临稍微突发的情况时,感到慌乱;遭遇一点挫折时,情绪低落;面对问题,不是首先思考解决办法,而是抱怨不已。这种心态基本上无法取得成功 做事雷厉风行,需要…...
ChatGPT等大模型安全指南:从数据泄露防护到模型滥用防范的7个关键策略
大模型安全实战手册:7个维度构建企业级防护体系 当ChatGPT在2023年掀起生成式AI的浪潮时,某跨国咨询公司曾发生一起典型的数据泄露事件——工程师将包含客户隐私的对话记录误上传至公开代码库,导致3.2万条敏感数据暴露。这个案例揭示了大模型…...
OMO·赶考小状元AI自习室:破解线下自习室困局,引领学习新范式
近年来,一个有趣的现象在教培领域悄然发生:传统线下自习室逐渐遇冷,客流量与用户粘性面临挑战;而与此同时,一种名为“AI自习室”的新形态却异军突起,展现出强大的市场吸引力。这背后,并非简单的…...
从脑电波到股票K线:EMD经验模态分解在5个真实场景下的避坑指南
从脑电波到股票K线:EMD经验模态分解在5个真实场景下的避坑指南 当你第一次看到脑电波信号与股票K线图被放在同一个分析框架下讨论时,可能会觉得这是两个毫不相关的领域。但事实上,无论是神经科学家的EEG数据,还是量化交易员的股价…...
知识蒸馏(Knowledge Distillation)完全指南:原理、实践与进阶
一句话概括:知识蒸馏是一种模型压缩技术,它让一个轻量级的“学生模型”模仿一个高性能的“教师模型”的输出行为,从而在保持小体积、低延迟的同时,获得接近大模型的能力。一、为什么需要知识蒸馏?—— 大模型的“奢侈”…...
TranslucentTB:Windows任务栏透明化与个性化定制工具完全指南
TranslucentTB:Windows任务栏透明化与个性化定制工具完全指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB是…...
PCB板验证
铺铜完成是PCB设计中的一个重要里程碑,但还不是终点。在发送给板厂生产之前,还需要完成一系列关键的验证、优化和文件输出工作。简单来说,铺铜之后的标准流程是:设计验证(DRC/DFM) → 必要分析(…...
ZYNQ双核通信必看:共享内存的Cache一致性处理实战
ZYNQ双核通信中的Cache一致性实战指南 在嵌入式系统开发中,多核处理器间的数据共享一直是开发者面临的挑战之一。Xilinx ZYNQ系列SoC凭借其ARM双核Cortex-A9架构与可编程逻辑的完美结合,为高性能嵌入式应用提供了强大支持。然而,当两个核心需…...
CDN 报错 403/502/504 怎么解决?源站与防护策略排查
网站接入CDN后,原本访问流畅,突然出现403、502、504报错,用户反馈无法访问,自己排查半天找不到头绪——其实这类报错大多和「源站状态」「防护策略」「CDN配置」三个环节相关,今天就结合实操经验,把这三种常…...
PaddleOCR Docker镜像实战:从Java调用到表格识别,一个容器搞定OCR全流程
PaddleOCR Docker镜像实战:从Java调用到表格识别全流程指南 在数字化转型浪潮中,OCR(光学字符识别)技术已成为企业处理纸质文档、票据和表格数据的关键工具。PaddleOCR作为百度开源的OCR解决方案,凭借其出色的中文识别…...
Anthropic公司内容管理系统配置错误致大模型泄露引市场震荡
配置错误:Claude Mythos大模型意外泄露3月30日,据SiliconAngle报道,Anthropic公司内容管理系统发生配置错误,导致正在测试的新一代大语言模型Claude Mythos意外泄露。官方证实,该模型是公司“迄今为止构建的能力最强的…...
