Python综合案例—利用tkinter实现计算器的程序

news2025/2/25 10:13:14

目录

一、导入 tkinter 库

定义全局变量

二、定义回调函数

三、创建窗口对象

四、创建标签控件

五、创建数字按钮

六、创建加、减、乘、除和等于按钮

七、创建清空按钮

八、总结


        用Python实现计算器可以让我们更好地理解面向对象编程、GUI 编程和事件驱动编程等概念,并掌握 Python 语言的基本语法和常用库。同时,计算器是一种常见的应用程序,实现它不仅可以提高我们的编程技能,还可以方便我们平时进行简单的计算。

        在编写计算器程序的过程中,我们需要考虑很多问题,如如何设计 GUI 界面、如何处理用户输入、如何进行数值计算等等。这些问题都是实际编写应用程序时必须面对的,因此通过实现计算器程序,我们可以更好地了解实际软件开发中的问题和解决方法。

用Python实现计算器的过程包括以下步骤:

  1. 导入所需库:我们需要使用 tkinter 库来创建 GUI 界面,并使用 eval 函数来进行数值计算。

  2. 创建 GUI 界面:使用 tkinter 库来创建一个窗口,并在窗口中添加数字按钮、运算符按钮和其他功能按钮,如清除按钮、等于按钮等。同时,也需要在界面上创建一个文本框来显示用户输入和计算结果。

  3. 处理用户输入:通过绑定按钮事件和键盘事件来处理用户对按钮的单击和键盘的输入。当用户单击数字按钮时,将数字添加到文本框中;当用户单击运算符按钮时,将操作符添加到文本框中。同时也需要处理删除字符和清空文本框等操作。

  4. 进行数值计算:当用户单击等于按钮时,使用 eval 函数来计算文本框中的表达式,并将结果显示在文本框中。

  5. 完善程序功能:根据需求可以增加其他功能,如添加小数点、处理错误输入、防止除零等。

一、导入 tkinter 库

在 Python 中,使用 import 语句可以导入其他模块或库。在这个程序中,我们首先需要导入 tkinter 库,以便创建 GUI 界面。具体的语句如下:

import tkinter as tk

这里我们将 tkinter 库重命名为 tk,以便在后面的代码中更方便地使用。

定义全局变量

在计算器程序中,我们需要保存当前输入的数字和运算符,以便进行计算。因此,我们在程序一开始就要定义一些变量来保存这些值。具体的变量有 num1num2operator,它们分别表示当前输入的第一个数字、第二个数字和运算符,初始值均为空字符串。此外,由于这些变量需要在多个函数中使用,因此我们将它们定义为全局变量。具体的语句如下:

# 定义全局变量,用于保存当前输入的数字和运算符
num1 = ''
num2 = ''
operator = ''

二、定义回调函数

在 GUI 界面中,按钮、菜单等控件被点击时会触发相应的事件,我们需要编写回调函数来处理这些事件。在这个程序中,我们需要编写三个回调函数,分别用于将数字、运算符和等于号添加到显示屏上,具体的函数如下:

  • add_digit(digit):该函数用于将数字添加到显示屏上。它的参数 digit 表示当前点击的数字,函数会将该数字添加到 num1num2 变量中,并更新显示屏的内容。如果当前没有输入运算符,则数字会被添加到 num1 中;否则,数字会被添加到 num2 中。具体的代码如下:

  • def add_digit(digit):
        global num1, num2, operator
        if 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, operator
        if num1 != '' and num2 == '':
            operator = op
            label.config(text=num1 + operator)
    
  • calculate():该函数用于计算结果。它会根据当前缓存的数字和运算符计算结果,并更新显示屏的内容。具体的代码如下:

  • def calculate():
        global num1, num2, operator
        if 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=0column=0 表示该控件位于第 1 行、第 1 列,columnspan=4 表示该控件跨越了 4 列(即占据整个顶部),padx=10pady=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=3height=2 表示按钮的宽度和高度;command=lambda digit=i:add_digit(digit) 表示按钮被点击后会调用 add_digit() 函数,并将当前的数字作为参数传递给该函数。在 grid() 方法中,row=(i-1)//3+1column=(i-1)%3 表示按钮的行列号,padx=5pady=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=3height=2 表示按钮的宽度和高度;command=lambda:add_operator('+')command=lambda:add_operator('-')command=lambda:add_operator('*')command=lambda:add_operator('/') 表示分别将加、减、乘、除按钮的回调函数设置为 add_operator() 函数,并将相应的运算符作为参数传递给该函数;command=calculate 表示将等于按钮的回调函数设置为 calculate() 函数。在 grid() 方法中,rowcolumn 表示按钮的行列号,padxpady 表示控件边缘和窗口边框之间的水平和垂直间距。

七、创建清空按钮

在 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() 函数,该函数会将数字添加到 num1num2 变量中,并更新显示屏的内容。当用户点击加、减、乘、除按钮时,会调用 add_operator() 函数,该函数会将运算符添加到 operator 变量中,并更新显示屏的内容。当用户点击等于按钮时,会调用 calculate() 函数,该函数会根据当前缓存的数字和运算符计算结果,并更新显示屏的内容。最后,当用户点击清空按钮时,会调用 clear() 函数,该函数会清空显示屏和缓存的数字和运算符。

完整代码:

import tkinter as tk

# 定义全局变量,用于保存当前输入的数字和运算符
num1 = ''
num2 = ''
operator = ''

# 定义一个函数,用于将数字添加到显示屏上
def add_digit(digit):
    global num1, num2, operator
    if operator == '':
        num1 += str(digit)
        label.config(text=num1)
    else:
        num2 += str(digit)
        label.config(text=num2)

# 定义一个函数,用于将运算符添加到显示屏上
def add_operator(op):
    global num1, num2, operator
    if num1 != '' and num2 == '':
        operator = op
        label.config(text=num1 + operator)

# 定义一个函数,用于计算结果
def calculate():
    global num1, num2, operator
    if 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, operator
    num1 = ''
    num2 = ''
    operator = ''
    label.config(text='0')

# 进入主消息循环
window.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知识变现海哥:掌握这四个步骤,轻松实现知识变现

你是否有过这种感受,看了很多书,网上报课花了很多钱,课程屯了很多,可是依然很难变现,问题出在哪里呢? 海哥写这本《知识变现道法术器》将为你揭开答案。 海哥,国内知名知识变现创业教练&#x…

Java开发 - 不知道算不算详细的MySQL多维度性能优化剖析

前言 MySQL性能优化是一个很大的话题,小到一句SQL,大到一个系统,都是我们优化的目标,博主之前曾写过一篇关于SQL优化的博客,感兴趣的小伙伴直接点击即可。本篇,我们将从多个维度来讲解MYSQL性能优化相关的…

【Python】朴实无华的yolov5环境配置

前言 最近有一个项目需要用到目标识别,于是我一下子就想到了大名鼎鼎的yolo,于是花了一天时间了解了一下。但是很遗憾的是,我自己随便配置的一个环境能运行torch,但是只要一训练yolov5的库,电脑就要蓝屏, 随…

为什么是ChatGPT引发了AI浪潮?

目录 BERT和GPT简介 BERT和GPT核心差异 GPT的优势 GPT的劣势 总结 随着近期ChatGPT的火热,引发各行各业都开始讨论AI,以及AI可以如何应用到各个细分场景。为了不被时代“抛弃”,我也投入了相当的精力用于研究和探索。但在试验的过程中&…

FE_Vue学习笔记 插槽 slot

插槽分为匿名插槽、具名插槽、作用域插槽。子组件中: 匿名插槽只能有一个;可以有多个具名插槽;作用域插槽中可以有匿名插槽和具名插槽。 当项目中一个组件可以多次复用时,我们可以把这个组件封装成单独的.vue文件,从…

【UDS】ISO15765-2之网络时间参数

文章目录 简介分类1. N_As2. N_Ar3. N_Bs4. N_Br5. N_Cs5. N_Cr 总结 ->返回总目录<- 简介 网络层定时参数定义了N_As、N_Ar、N_Bs、N_Br、N_Cs、N_Cr六个参数。 这些时间参数在多帧传输中可以定义在下图的过程中 分类 1. N_As 方向&#xff1a; 发送方->接收方 …

听我一句劝,不要去外包,两年外包生涯做完,感觉自己废了一半....

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近5年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

springmvc执行请求的顺序

当一个请求执行时&#xff0c;springMVC的DispatcherServlet&#xff08;前端控制器&#xff09; 会拦截到他&#xff0c;然后调用HandlerMapping &#xff08;处理器映射器&#xff09;&#xff0c;找到对应的URL地址&#xff0c;然后返回给前端控制器。前端控制器根据返回的U…

基于列系数比较一组迭代次数的顺序

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点&#xff0c;训练集AB各由6张二值化的图片组成&#xff0c;让A中每行有1个1&#xff0c;B中全是0&#xff0c;排列组合A &#xff0c;统计迭代次数的顺序。共有729组不同的排列组合&#xff0c;但按照对称性只有26…

第一个Go语言程序

第一个Go语言程序 目录 第一个Go语言程序引言Go的开发环境安装GoPATH编辑器 第一个Go程序总结 引言 本系列博客将手把手带着大家从零基础入门go语言&#xff0c;不定时更新吧&#xff0c;自己学到哪就更新到哪&#xff0c;先讲讲为什么要学习go语言&#xff1a;列出以下几点go…

<TensorRT> 下载及部署

TensorRT-下载及部署 1、下载前相关查询 查看显卡驱动版本&#xff1a;nvidia-smi 查看cuda版本&#xff1a;nvcc -V cuda与显卡驱动对应表&#xff1a;https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#title-new-features TensorRT兼容性查询&#…

详解静态、动态代理以及应用场景

一篇不太一样的代理模式详解&#xff0c;仔细阅读&#xff0c;你一定会获取不一样的代理见解&#xff0c;而不是人云亦云。 查看了社区里关于代理模式描述&#xff0c;发现很多博客千篇一律甚至存在共性错误&#xff0c;写此文提出自己对代理的见解。 静态代理动态代理 JDKCGLi…

ChitGPT回答tp6写答题系统

答题系统是一个涉及多个模块的复杂系统&#xff0c;需要涉及到前端展示、后台管理、题库管理、试卷生成、考试管理等方面。下面我将简单介绍用thinkphp6框架如何实现一个基本的答题系统。 首先&#xff0c;我们需要创建数据库并设计数据表&#xff0c;包括用户表、题目表、试卷…

每日学术速递5.7

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Multimodal Procedural Planning via Dual Text-Image Prompting 标题&#xff1a;通过双文本图像提示进行多模态程序规划 作者&#xff1a;Yujie Lu, Pan Lu, Zhiyu Chen, Wanron…

微信小程序文件上传、下载和图片处理、文件操作API的使用

这次按照我的理解来做这部分的笔记 首先&#xff0c;复习上节课所学的内容。就是网络请求api的使用 现在我有一个需求就是点击按钮实现获取后端返回的图片 先打开服务器 看一下我们要返回的图片路径 书写结构 看一下返回来的数据。是在data下的banners里。因此我们封装一下 这…

【利用AI刷面试题】50道前端基础面试题

文章目录 以下是一些可能出现在前端基础面试中的问题&#xff1a;1. 如何判断当前浏览器是否支持某个 HTML5 特性&#xff1f;2. Box-sizing 属性有哪些取值&#xff0c;分别代表什么意思&#xff1f;3. 什么是浏览器的同源策略&#xff1f;4. 什么是 CORS&#xff1f;如何使用…

rabbitmq+mqtt+docker-compose搭建MQTT服务器和.netcore 客户端实现 订阅+发布

1 搭建MQTT服务器 1.1 Dockerfile 内容 FROM rabbitmq:3.11.6-management COPY install_rabbitmq_plus.sh /usr/local/ RUN chmod 777 /usr/local/install_rabbitmq_plus.sh RUN /bin/sh /usr/local/install_rabbitmq_plus.sh 1.2 容器中需要安装插件的命令 放在 insta…

假如ChatGPT 去面试前端工程师,结果会怎么样?

近日&#xff0c;有个叫 ChatGPT 的同学来我司面试前端&#xff0c;考考他面试八股文。先来问问闭包。 第一问&#xff0c;说说 JS 闭包 追问&#xff0c;详细讲讲闭包 由于篇幅太长&#xff0c;转成文字&#xff0c;以下皆为 ChatGPT 回答 闭包是一个非常重要的 JavaScript 概…

Maven构建Java项目Maven构建项目测试Maven引入外部依赖Maven项目模板

目录 Maven 构建 Java 项目 解释一下这段代码&#xff0c;为什么可以构建一个目录清晰的maven项目“mvn archetype:generate "-DgroupIdcom.companyname.bank" "-DartifactIdconsumerBanking" "-DarchetypeArtifactIdmaven-archetype-quickstart&qu…

volatile的实现简单概述

文章目录 内存屏障volatile关键字的实现synchronized关键字的实现 内存屏障 在讲解是关键字之前&#xff0c;先来了解下内存屏障的概念。 处理器保障禁止内存重排序的指令被称为基本内存屏障。其作用是禁止该屏障前后之间的操作进行重排序&#xff0c;要确保指令前的操作要先…