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…...
我的一些感悟
记录一些感悟,不定时更新 当面临稍微突发的情况时,感到慌乱;遭遇一点挫折时,情绪低落;面对问题,不是首先思考解决办法,而是抱怨不已。这种心态基本上无法取得成功 做事雷厉风行,需要…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
