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…...
我的一些感悟
记录一些感悟,不定时更新 当面临稍微突发的情况时,感到慌乱;遭遇一点挫折时,情绪低落;面对问题,不是首先思考解决办法,而是抱怨不已。这种心态基本上无法取得成功 做事雷厉风行,需要…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...