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()
函数传递按钮的标签作为事件处理函数的参数。
最后,我们更新col
和row
的值,确保按钮的位置正确。
处理键盘输入
除了通过点击按钮来输入内容之外,我们还希望用户能够使用键盘输入。为了实现这一点,我们需要使用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()
总结
在本文中,我们使用Python的tkinter库编写了一个带有图形用户界面的计算器程序。我们学习了如何创建计算器窗口、处理用户输入、创建按钮并绑定事件、处理键盘输入以及运行程序的整个流程。
希望本文能够帮助你理解如何使用Python编写带有图形界面的计算器程序。如果您有任何问题,请随时提问!
相关文章:

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

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

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

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

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

PCL点云处理之配准中的匹配对连线可视化显示 Correspondences(二百一十九)
PCL点云处理之配准中的匹配对连线可视化显示 Correspondences(二百一十九) 一、算法介绍二、算法实现1.可视化代码2.完整代码(特征匹配+可视化)最终效果一、算法介绍 关于点云配准中的匹配对,如果能够可视化将极大提高实验的准确性,还好PCL提供了这样的可视化工具,做法…...
Vue el-table全表搜索,模糊匹配-前端静态查询
后端返回的数据是全部的数据,没有分页,前端需要做的是分页全表模糊查询 代码: //根据关键字对表全局搜索 globalSearch() {//为了拿到对象的列名let filterList Object.keys(this.tableData[0]);if (this.searchWord) {this.tableFilterDat…...

基于html5开发的Win12网页版,抢先体验
据 MSPoweruser 报道,Windows 11虽然刚刚开始步入正轨,但最新爆料称微软已经在开启下一个计划,Windows 12 的开发将在 去年3 月份开始。德国科技网站 Deskmodder.de 称,根据内部消息,微软将在 2022年3 月开始开发 Wind…...

Studio One6.5中文版本下载安装步骤
在唱歌效果调试当中,我们经常给客户安装的几款音频工作站。第一,Studio One 6是PreSonus公司开发的一款功能强大的音频工作平台,具有丰富的音频处理功能和灵活的工作流程。以下是Studio One6的一些主要特点: 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的知识,记得关注,会一直更新~ 访问命令行 任务执行清单 在本实验中,您将使用Bash shell来执行命令。 成果 使用Bash shell命令行成功运行简单的程序。 执行用于识别文件类型并显示文本文件部分内容的命…...

Linux系统编程详解
Linux 多线程编程 什么是线程? 与线程类似,线程是允许应用程序并发执行多个任务的一种机制 线程是轻量级的进程(LWP:Light Weight Process),在 Linux 环境下线程的本 质仍是进程。 一个进程可以包含多个线…...

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

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

【环境搭建】linux docker-compose安装seata1.6.1,使用nacos注册、db模式
新建目录,挂载用 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文件(seata包目录的script文件夹有&#…...
20231008-20231013 读书笔记
计算机硬件 基本硬件系统:运算器、控制器、存储器、输入设备和输出设备中央处理单元(CPU):运算器、控制器、寄存器组和内部总线等部件组成 功能:程序控制、操作控制、时间控制、数据处理运算器: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架构的性能比较低往往需要交叉编译,v8的板子性能往往比较好,可以直接在板子上编译。 解压到ubuntu里面。这里介绍v7架构的。 2、ubuntu环境配置 ubuntu下安装软件…...

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

Opencv——颜色模型+通道分离与合并
视频加载/摄像头调用 VideoCapture允许一开始定义一个空的对象 VideoCapture video VideoCapture(const String &filename,int apiPreferenceCAP_ANY) filename:读取的视频文件或者图像序列名称 apiPreference:读取数据时设置的属性,例如编码格式、是否调用Op…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

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可以提供外设…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...