当前位置: 首页 > news >正文

Python实现带图形界面的计算器

Python实现带图形界面的计算器

在本文中,我们将使用Python编写一个带有图形用户界面的计算器程序。这个程序将允许用户通过点击按钮或键盘输入数字和操作符,并在显示屏上显示计算结果。

开发环境准备

要运行这个计算器程序,您需要安装Python 3和tkinter库。首先,您可以从Python官方网站https://www.python.org/downloads/下载并安装最新版本的Python。安装完成后,打开命令提示符并输入以下命令来安装tkinter库:

pip install tk

创建计算器窗口

我们将使用tkinter库创建图形用户界面。首先,让我们导入必要的库并编写创建计算器窗口的函数:

import tkinter as tk
from functools import partialdef create_calculator_window():window = tk.Tk()window.geometry("300x400")window.title("计算器")# 在窗口中创建一个标签作为计算器的显示屏display = tk.Label(window, text="", font=("Helvetica", 16), height=2, width=18)display.grid(row=0, column=0, columnspan=4, pady=10)# ...window.mainloop()if __name__ == "__main__":create_calculator_window()

在上面的代码中,我们使用Tk()函数创建了一个名为window的窗口。然后,我们使用geometry()方法设置窗口的大小为300x400像素,并使用title()方法设置窗口的标题为"计算器"。

接下来,我们使用Label()函数创建了一个名为display的标签,作为计算器的显示屏。我们设置了标签的文本为空字符串,字体为Helvetica,字号为16,高度为2,宽度为18,并使用grid()方法将标签放置在窗口的第0行、第0列,横跨4列,上下间距为10像素。

处理用户的输入

计算器的操作都是通过用户的输入来完成的。我们需要定义一个函数来处理每个按钮的点击事件,并更新显示屏上的文本。让我们来编写这个函数:

def on_keypress(key):if key == "AC":display["text"] = ""elif key == "←":display["text"] = display["text"][:-1]elif key == "%":try:expression = eval(display["text"])display["text"] = str(expression / 100)except:display["text"] = "Error"elif key == "=":try:expression = display["text"]expression = expression.replace("÷", "/")expression = expression.replace("x", "*")result = eval(expression)if isinstance(result, float) and result.is_integer():result = int(result)display["text"] = str(result)except:display["text"] = "Error"else:if "=" in display["text"]:display["text"] = ""display["text"] += key

在上面的代码中,我们定义了一个名为on_keypress()的函数,接受一个名为key的参数,表示用户按下的按钮。

首先,我们检查key的值是否为"AC",如果是,我们将显示屏的文本设置为空字符串,即清零。

然后,我们检查key的值是否为"←",如果是,我们将显示屏的文本设置为当前文本的前一个字符。

接下来,我们检查key的值是否为"%“,如果是,我们尝试将显示屏上的表达式转换为一个浮点数,并将结果除以100。如果转换和计算过程中没有出现错误,我们将结果转换为字符串并更新显示屏的文本。否则,我们将显示屏的文本设置为"Error”。

然后,我们检查key的值是否为"=“,如果是,我们尝试解析并计算显示屏上的表达式。在计算之前,我们使用replace()方法将所有的"÷"替换为”/“,将所有的"x"替换为”*“,以便让Python的eval()函数理解这些操作符。然后,我们使用eval()函数计算表达式的结果,并将结果转换为字符串更新显示屏的文本。如果计算过程中出现任何错误,我们将显示屏的文本设置为"Error”。

最后,如果用户按下的是其他按钮(即数字和操作符),我们检查显示屏的文本是否包含"="。如果包含,说明用户正在输入新的表达式,我们将显示屏的文本设置为空字符串。然后,我们将用户的输入字符添加到显示屏的文本末尾。

创建按钮并绑定事件

接下来,我们需要创建所有的按钮,并将它们与对应的事件绑定在一起。让我们编写创建按钮的代码:

keys = [("AC", on_keypress),("←", on_keypress),("%", on_keypress),("÷", on_keypress),("7", on_keypress),("8", on_keypress),("9", on_keypress),("x", on_keypress),("4", on_keypress),("5", on_keypress),("6", on_keypress),("-", on_keypress),("1", on_keypress),("2", on_keypress),("3", on_keypress),("+", on_keypress),("0", on_keypress),(".", on_keypress),("(", on_keypress),(")", on_keypress),("=", on_keypress)
]row = 1
col = 0
for key, command in keys:button = tk.Button(window, text=key, font=("Helvetica", 12), height=2, width=5)button.grid(row=row, column=col, padx=5, pady=5)button.configure(command=partial(command, key))col += 1if col > 3:col = 0row += 1

在上面的代码中,我们创建了一个名为keys的列表,包含了所有按钮的标签和事件处理函数。

然后,我们使用for循环遍历keys列表中的每个元素。对于每个元素,我们使用Button()函数创建一个按钮,并设置按钮的文本、字体、高度和宽度。然后,我们使用grid()方法将按钮放置在窗口中的指定位置,并设置上下和左右的间距。

接下来,我们使用configure()方法将按钮的command属性设置为要执行的事件处理函数,并使用partial()函数传递按钮的标签作为事件处理函数的参数。

最后,我们更新colrow的值,确保按钮的位置正确。

处理键盘输入

除了通过点击按钮来输入内容之外,我们还希望用户能够使用键盘输入。为了实现这一点,我们需要使用bind()方法将键盘事件与相应的处理函数关联起来。让我们完成这一部分的代码:

window.bind("<Key>", lambda event: on_keypress(event.char))

在上面的代码中,我们使用bind()方法将"<Key>"事件与一个lambda函数关联起来。这个lambda函数将用户按下的字符作为参数,然后调用on_keypress()函数来处理这个字符。

运行计算器程序

最后,我们需要在if __name__ == "__main__":代码块中调用create_calculator_window()函数来运行计算器程序。

if __name__ == "__main__":create_calculator_window()

完整代码

下面是完整的带有图形界面的计算器程序的代码:

import tkinter as tk
from functools import partialdef create_calculator_window():window = tk.Tk()window.geometry("300x400")window.title("计算器")display = tk.Label(window, text="", font=("Helvetica", 16), height=2, width=18)display.grid(row=0, column=0, columnspan=4, pady=10)def on_keypress(key):if key == "AC":display["text"] = ""elif key == "←":display["text"] = display["text"][:-1]elif key == "%":try:expression = eval(display["text"])display["text"] = str(expression / 100)except:display["text"] = "Error"elif key == "=":try:expression = display["text"]expression = expression.replace("÷", "/")expression = expression.replace("x", "*")result = eval(expression)if isinstance(result, float) and result.is_integer():result = int(result)display["text"] = str(result)except:display["text"] = "Error"else:if "=" in display["text"]:display["text"] = ""display["text"] += keykeys = [("AC", on_keypress),("←", on_keypress),("%", on_keypress),("÷", on_keypress),("7", on_keypress),("8", on_keypress),("9", on_keypress),("x", on_keypress),("4", on_keypress),("5", on_keypress),("6", on_keypress),("-", on_keypress),("1", on_keypress),("2", on_keypress),("3", on_keypress),("+", on_keypress),("0", on_keypress),(".", on_keypress),("(", on_keypress),(")", on_keypress),("=", on_keypress)]row = 1col = 0for key, command in keys:button = tk.Button(window, text=key, font=("Helvetica", 12), height=2, width=5)button.grid(row=row, column=col, padx=5, pady=5)button.configure(command=partial(command, key))col += 1if col > 3:col = 0row += 1window.bind("<Key>", lambda event: on_keypress(event.char))window.mainloop()if __name__ == "__main__":create_calculator_window()

总结

效果1
效果2

在本文中,我们使用Python的tkinter库编写了一个带有图形用户界面的计算器程序。我们学习了如何创建计算器窗口、处理用户输入、创建按钮并绑定事件、处理键盘输入以及运行程序的整个流程。

希望本文能够帮助你理解如何使用Python编写带有图形界面的计算器程序。如果您有任何问题,请随时提问!

相关文章:

Python实现带图形界面的计算器

Python实现带图形界面的计算器 在本文中&#xff0c;我们将使用Python编写一个带有图形用户界面的计算器程序。这个程序将允许用户通过点击按钮或键盘输入数字和操作符&#xff0c;并在显示屏上显示计算结果。 开发环境准备 要运行这个计算器程序&#xff0c;您需要安装Pyth…...

$ vue -Vbash: vue: command not found

$ vue -V bash: vue: command not found报这个错&#xff0c;我们需要找到vue安装路径&#xff0c;添加在环境变量的用户变量中&#xff1a; 1、vue安装路径 2、编辑环境变量 然后重新打开命令框&#xff0c;就可以了...

专业音视频领域中,Pro AV的崛起之路

编者按&#xff1a;在技术进步的加持下&#xff0c;AV行业发展得如何了&#xff1f;本文采访了两位深耕于广播电视行业的技术人&#xff0c;为我们介绍了专业音视频的进展&#xff1a;一位冉冉升起的新星&#xff1a;Pro AV以及FPGA在其中发挥的作用。 美国&#xff0c;拉斯维加…...

vscode 右侧滚动条标记不提示,问题解决纪录

问题描述 用vscode看代码时&#xff0c;我希望在右侧提示一个变量在文件下都在那里使用&#xff0c;在那里赋值&#xff0c;之前该功能是存在的&#xff0c;当我打开一个新的文件夹时这个功能消失了。 解决办法 在setting.json文件下输入 "C_Cpp.intelliSenseEngine&…...

【Java 进阶篇】JavaScript特殊语法详解

JavaScript是一门非常灵活的编程语言&#xff0c;允许开发人员使用多种不同的语法和技巧来解决各种问题。本篇博客将深入探讨JavaScript中的一些特殊语法&#xff0c;这些语法可能不是常规的JavaScript编程知识&#xff0c;但它们对于理解语言的强大之处以及在某些情况下解决问…...

PCL点云处理之配准中的匹配对连线可视化显示 Correspondences(二百一十九)

PCL点云处理之配准中的匹配对连线可视化显示 Correspondences(二百一十九) 一、算法介绍二、算法实现1.可视化代码2.完整代码(特征匹配+可视化)最终效果一、算法介绍 关于点云配准中的匹配对,如果能够可视化将极大提高实验的准确性,还好PCL提供了这样的可视化工具,做法…...

Vue el-table全表搜索,模糊匹配-前端静态查询

后端返回的数据是全部的数据&#xff0c;没有分页&#xff0c;前端需要做的是分页全表模糊查询 代码&#xff1a; //根据关键字对表全局搜索 globalSearch() {//为了拿到对象的列名let filterList Object.keys(this.tableData[0]);if (this.searchWord) {this.tableFilterDat…...

基于html5开发的Win12网页版,抢先体验

据 MSPoweruser 报道&#xff0c;Windows 11虽然刚刚开始步入正轨&#xff0c;但最新爆料称微软已经在开启下一个计划&#xff0c;Windows 12 的开发将在 去年3 月份开始。德国科技网站 Deskmodder.de 称&#xff0c;根据内部消息&#xff0c;微软将在 2022年3 月开始开发 Wind…...

Studio One6.5中文版本下载安装步骤

在唱歌效果调试当中&#xff0c;我们经常给客户安装的几款音频工作站。第一&#xff0c;Studio One 6是PreSonus公司开发的一款功能强大的音频工作平台&#xff0c;具有丰富的音频处理功能和灵活的工作流程。以下是Studio One6的一些主要特点&#xff1a; 1.多轨录音和编辑&…...

Java架构师缓存架构设计解决方案

目录 1 缓存常见的三大问题1.1 缓存雪崩1.2 缓存穿透1.3 缓存击穿2 缓存key的生成策略3 热点数据集中失效的问题4 如何提高缓存的命中率5 缓存和数据库双写不一致的问题6 如何对缓存数据进行分片想学习架构师构建流程请跳转:Java架构师系统架构设计 1 缓存常见的三大问题 缓…...

【玩转Redhat Linux 8.0系列 | 实验—使用Bash shell执行命令】

今天继续分享一些Redhat Linux 8.0的知识&#xff0c;记得关注&#xff0c;会一直更新~ 访问命令行 任务执行清单 在本实验中&#xff0c;您将使用Bash shell来执行命令。 成果 使用Bash shell命令行成功运行简单的程序。 执行用于识别文件类型并显示文本文件部分内容的命…...

Linux系统编程详解

Linux 多线程编程 什么是线程&#xff1f; 与线程类似&#xff0c;线程是允许应用程序并发执行多个任务的一种机制 线程是轻量级的进程&#xff08;LWP&#xff1a;Light Weight Process&#xff09;&#xff0c;在 Linux 环境下线程的本 质仍是进程。 一个进程可以包含多个线…...

ios设备管理软件iMazing 2.17.11官方中文版新增功能介绍

iMazing 2.17.11官方中文版(ios设备管理软件)是一款管理苹果设备的软件&#xff0c; Windows 平台上的一款帮助用户管理 IOS 手机的应用程序&#xff0c;软件功能非常强大&#xff0c;界面简洁明晰、操作方便快捷&#xff0c;设计得非常人性化。iMazing官方版与苹果设备连接后&…...

算法通关村第18关【青铜】| 回溯

回溯算法是一种解决组合优化问题和搜索问题的算法。它通过尝试各种可能的选择来找到问题的解决方案。回溯算法通常用于问题的解空间非常大&#xff0c;而传统的穷举法会导致计算时间爆炸的情况。回溯算法可以帮助限制搜索空间&#xff0c;以提高效率。 回溯算法的核心思想是在…...

【环境搭建】linux docker-compose安装seata1.6.1,使用nacos注册、db模式

新建目录&#xff0c;挂载用 mkdir -p /data/docker/seata/resources mkdir -p /data/docker/seata/logs 给权限 chmod -R 777 /data/docker/seata 先在/data/docker/seata目录编写一个使用file启动的docker-compose.yml文件&#xff08;seata包目录的script文件夹有&#…...

20231008-20231013 读书笔记

计算机硬件 基本硬件系统&#xff1a;运算器、控制器、存储器、输入设备和输出设备中央处理单元&#xff08;CPU&#xff09;:运算器、控制器、寄存器组和内部总线等部件组成 功能&#xff1a;程序控制、操作控制、时间控制、数据处理运算器&#xff1a;ALU、AC、DR、PSW控制器…...

YOLOv8 windows下的离线安装 offline install 指南 -- 以 带有CUDA版本的pytorch 为例

文章大纲 简介基础环境与安装包的准备windows 下 lap 包的离线安装conda 打包基础环境使用 pip 下载 whl 包特别的注意:pytorch cuda 版本的下载迁移与部署流程基础python 的conda 环境迁移与准备必备包: 安装cuda 版本 的torch,torchvision,ultralytics参考文献与学习路径…...

百度车牌识别AI Linux使用方法-armV7交叉编译

1、获取百度ai的sdk 百度智能云-登录 (baidu.com) 里面有两个版本的armV7和armV8架构。v7架构的性能比较低往往需要交叉编译&#xff0c;v8的板子性能往往比较好&#xff0c;可以直接在板子上编译。 解压到ubuntu里面。这里介绍v7架构的。 2、ubuntu环境配置 ubuntu下安装软件…...

数学建模——确定性时间序列分析方法

目录 介绍 确定性时间序列分析方法 1、时间序列的常见趋势 &#xff08;1&#xff09;长期趋势 &#xff08;2&#xff09;季节变动 &#xff08;3&#xff09;循环变动 &#xff08;4&#xff09;不规则变动 常见的时间序列模型有以下几类 2、时间序列预测的具体方法 …...

Opencv——颜色模型+通道分离与合并

视频加载/摄像头调用 VideoCapture允许一开始定义一个空的对象 VideoCapture video VideoCapture(const String &filename,int apiPreferenceCAP_ANY) filename:读取的视频文件或者图像序列名称 apiPreference:读取数据时设置的属性&#xff0c;例如编码格式、是否调用Op…...

解码自然语言处理之 Transformers

自 2017 年推出以来&#xff0c;Transformer 已成为机器学习领域的一支重要力量&#xff0c;彻底改变了翻译和自动完成服务的功能。 最近&#xff0c;随着 OpenAI 的 ChatGPT、GPT-4 和 Meta 的 LLama 等大型语言模型的出现&#xff0c;Transformer 的受欢迎程度进一步飙升。这…...

【前端设计模式】之迭代器模式

迭代器模式是一种行为设计模式&#xff0c;它允许我们按照特定的方式遍历集合对象&#xff0c;而无需暴露其内部实现。在前端开发中&#xff0c;迭代器模式可以帮助我们更好地管理和操作数据集合。 迭代器模式特性 封装集合对象的内部结构&#xff0c;使其对外部透明。提供一…...

【Android知识笔记】图片专题(BitmapDrawable)

如何计算一张图片的占用内存大小? 注意是占用内存,不是文件大小可以运行时获取重要的是能直接掌握计算方法基础知识 Android 屏幕像素密度分类: (其实还有一种 ldpi = 120,不过这个已经绝种了,所以最低的只需关心mdpi即可) 上表中的比例为:m : h : xh : xxh: xxxh = …...

前端工程化知识系列(10)

目录 91. 了解前端工程化中的容器化和云部署概念&#xff0c;以及如何使用Docker和Kubernetes等工具来实现它们&#xff1f;92. 你如何管理前端项目的文档和知识共享&#xff0c;以确保团队成员都能理解和使用前端工程化工具和流程&#xff1f;93. 了解前端开发中的大规模和跨团…...

大数据flink篇之三-flink运行环境安装(一)单机Standalone安装

一、安装包下载地址 https://archive.apache.org/dist/flink/flink-1.15.0/ 二、安装配置流程 前提基础&#xff1a;Centos环境&#xff08;建议7以上&#xff09; 安装命令&#xff1a; 解压&#xff1a;tar -zxvf flink-xxxx.tar.gz 修改配置conf/flink-conf.yaml&#xff1…...

Redisson使用延时队列

延时队列 在开发中&#xff0c;有时需要使用延时队列。 比如&#xff0c;订单15分钟内未支付自动取消。 jdk延时队列 如果使用 jdk自带的延时队列&#xff0c;那么服务器挂了或者重启时&#xff0c;延时队列里的数据就会失效&#xff0c;可用性比较差。 Redisson延时队列 …...

基于php 进行每半小时钉钉预警

前言 业务场景&#xff1a;监控当前业务当出现并发情况时技术人员可以可以及时处理 使用技术栈&#xff1a; laravelredis 半小时触发一次报警信息实现思路 1、xshell脚本 具体参数就不详细解释了&#xff0c;想要详细了解可以自行百度 curl -H "Content-Type:appl…...

5.Python-使用XMLHttpRequest对象来发送Ajax请求

题记 使用XMLHttpRequest对象来发送Ajax请求&#xff0c;以下是一个简单的实例和操作过程。 安装flask模块 pip install flask 安装mysql.connector模块 pip install mysql-connector-python 编写app.py文件 app.py文件如下&#xff1a; from flask import Flask, reque…...

八皇后问题的解析与实现

问题描述 八皇后问题是一个古老而又著名的问题。 时间退回到1848年,国际西洋棋棋手马克斯贝瑟尔提出了这样的一个问题: 在88格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。 如何找到这所有的…...

论文浅尝 | 深度神经网络的模型压缩

笔记整理&#xff1a;闵德海&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/abs/1412.6550 动机 提高神经网络的深度通常可以提高网络性能&#xff0c;但它也使基于梯度的训练更加困难&#xff0c;因为更深的网络往往更加强的非线…...