如何在 Python 中创建一个类似于 MS 计算器的 GUI 计算器

在这里插入图片描述

  1. 问题背景

假设我们需要创建一个类似于微软计算器的 GUI 计算器。这个计算器应该具有以下功能:

  • 能够显示第一个输入的数字。
  • 当按下运算符时,输入框仍显示第一个数字。
  • 当按下第二个数字时,第一个数字被替换。
  1. 解决方案

为了解决这个问题,我们需要使用状态的概念。每次按下按键时,检查状态并确定要采取的操作。

  • 起始状态:输入数字。
  • 当按下运算符按钮时:存储运算符,改变状态。
  • 当按下另一个数字时:存储数字,清除数字输入,重新开始数字输入。
  • 当按下等号按钮时:使用存储的数字和运算符以及数字输入中的当前数字,执行操作。

使用动态语言,例如 Python,可以改变处理按键/按钮按下事件的函数,而不是使用变量和 if 语句来检查状态。

import tkinter as tk

class Calculator:
    def __init__(self):
        self.window = tk.Tk()
        self.window.title("Calculator")

        # 创建显示屏
        self.display = tk.Entry(self.window, width=30)
        self.display.grid(row=0, column=0, columnspan=4)

        # 创建数字按钮
        self.buttons = [
            ["7", "8", "9", "/"],
            ["4", "5", "6", "*"],
            ["1", "2", "3", "-"],
            ["0", ".", "=", "+"]
        ]

        # 创建运算符按钮
        self.operators = ["/", "*", "-", "+"]

        # 创建状态变量
        self.state = "number"

        # 创建数字列表
        self.numbers = []

        # 创建运算符列表
        self.operators = []

        # 创建计算结果变量
        self.result = None

        # 创建按钮
        for row in range(4):
            for column in range(4):
                button = tk.Button(self.window, text=self.buttons[row][column], command=lambda row=row, column=column: self.handle_button_press(row, column))
                button.grid(row=row+1, column=column)

    def handle_button_press(self, row, column):
        # 获取按钮值
        button_value = self.buttons[row][column]

        # 检查按钮值是否是数字
        if button_value in "0123456789.":
            # 如果是数字,则将数字添加到数字列表
            self.numbers.append(button_value)

            # 更新显示屏
            self.display.delete(0, tk.END)
            self.display.insert(0, "".join(self.numbers))

        # 检查按钮值是否是运算符
        elif button_value in self.operators:
            # 如果是运算符,则将运算符添加到运算符列表
            self.operators.append(button_value)

            # 改变状态
            self.state = "operator"

            # 更新显示屏
            self.display.delete(0, tk.END)
            self.display.insert(0, "".join(self.operators))

        # 检查按钮值是否是等号
        elif button_value == "=":
            # 如果是等号,则执行计算
            self.result = eval("".join(self.numbers) + self.operators[0] + "".join(self.numbers))

            # 更新显示屏
            self.display.delete(0, tk.END)
            self.display.insert(0, self.result)

            # 重置状态
            self.state = "number"

            # 清空数字列表和运算符列表
            self.numbers = []
            self.operators = []

    def run(self):
        self.window.mainloop()

if __name__ == "__main__":
    calculator = Calculator()
    calculator.run()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql高可用解决方案:MHA原理及实现

MHA:Master High Availability。对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要…

STL(一)

书写形式:string (const string& str, size_t pos, size_t len npos); 举例: int main(){ string url("https://mp.csdn.net/mp_blog/creation/editor?spm1000.2115.3001.4503") string sub1(url,0,5);//从下标为0开始向后5个字符&…

07列的完整性约束

文章目录 设置表字段的主键约束设置表字段的外键约束(FOREIGN KEY,FK)、设置表字段的非空约束(NOT NULL, NK)设置表字段唯一约束(UNIQUE,UK)设置表字段值自动增加(AUTO_INCREMENT)设置表字段的默认值(DEFAULT)修改默认值DEFAULT、自增长和非空NK设置表字段的主键约…

30.ROM-IP核的调用

(1)ROM IP核简介: ROM是只读存储器,是一种只能读出事先锁存的固态半导体存储器。其特性是一旦存储资料就无法再将之改变或删除,并且资料也不会因为电源关闭而消失。(掉电不丢失) FPGA使用内部RA…

JavaScript青少年简明教程:为何学习JavaScript及JavaScript简介

JavaScript青少年简明教程:为何学习JavaScript及JavaScript简介 JavaScript最初是为web浏览器(前端开发)设计的。它可以在所有现代浏览器中运行,包括Chrome, Firefox, Safari, Edge等。 这意味着JavaScript代码可以在任何能运行…

学习测试7-ADB的使用

ADB是什么? ADB,即 Android Debug Bridge(安卓调试桥) 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell&…

数据(图像)增广

一、数据增强 1、增加一个已有数据集,使得有更多的多样性,比如加入不同的背景噪音、改变图片的颜色和形状。 2、增强数据是在线生成的 3、增强类型: (1)翻转 (2)切割 (3&#xf…

MessageBox与HubSpot:企业沟通与客户管理的双重利器

今天咱们来聊聊两个超实用的工具——MessageBox和HubSpot。它们就像是你的超级助手,让你和客户沟通起来更顺畅,管理起来也更轻松。 先说说MessageBox吧 想象一下,你正在忙着工作,突然客户发来个消息,你嗖的一下就收到…

实验场:在几分钟内使用 Bedrock Anthropic Models 和 Elasticsearch 进行 RAG 实验

作者:来自 Elastic Joe McElroy, Aditya Tripathi 我们最近发布了 Elasticsearch Playground,这是一个新的低代码界面,开发人员可以通过 A/B 测试 LLM、调整提示(prompt)和分块数据来迭代和构建生产 RAG 应用程序。今天…

github恢复码怎么备份

https://docs.github.com/zh/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication-recovery-methods

电商IP分类及其应用是什么?

在现代电商运营中,IP地址不仅是网络通信的基础,也扮演着关键的角色,支持多种功能和应用场景。本文将介绍几种常见的电商IP分类,以及它们在电商领域中的具体应用。 1. 前台IP与后台IP 电商网站在运营过程中通常需要区分前台IP和后…

数据不可修改 确保数据安全-GS备份存储方案防病毒防勒索

为保障企业关键数据不被病毒或勒索软件侵害,通过Veeam数据不可变功能,存储内数据更安全

【计算机组成原理 | 第三篇】各个硬件的组成部分

前言: 在前面的文章中,我们介绍了计算机架构的基本组成。可以知道计算机的基本架构由“存储器”,“运算器”,“控制器”,“输入设备”,“输出设备”这五部分组成。 在这片文章中,我们来深入的了…

【若依管理系统】注意事项

1.前端字段必填 rules: {sceneName: [{ required: true, message: "场景名称不能为空", trigger: "blur" }],orderNum: [{ required: true, message: "显示排序不能为空", trigger: "blur" }], }, 2.IDEA,默认以debug模式…

dive deeper into tensor:从底层开始学习tensor

inspired by karpathy/micrograd: A tiny scalar-valued autograd engine and a neural net library on top of it with PyTorch-like API (github.com)and Taking PyTorch for Granted | wh (nrehiew.github.io). 这属于karpathy的karpathy/nn-zero-to-hero: Neural Networks…

数据库系统原理练习 | 作业2-第2章关系数据库(附答案)

整理自博主本科《数据库系统原理》专业课完成的课后作业,以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方,欢迎各位斧正。 专业课本: 目录 一、选择题 二、填空题 三、简答题 四、关系代数 1.课本p70页&…

插片式远程 I/O模块:Profinet总线耦合器在SIMATIC Manager配置

XD9000是Profinet总线耦合器,单个耦合器最多可扩展32个I/O模块!本文将详细介绍如何在SIMATIC Manager中配置插片式远程 I/O模块的Profinet总线耦合器,帮助您更好地应用这一技术。 一、SIMATIC Manager软件组态步骤: 1、创建工程&…

bevfomer self-att to transformer to tensorrt

self-attentation https://blog.csdn.net/weixin_42110638/article/details/134016569 query input* Wq key input* Wk value input* Wv output 求和 query . key * value detr multiScaleDeformableAttn Deformable Attention Module,在图像特征上&#…

利用 Plotly.js 创建交互式条形图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 利用 Plotly.js 创建交互式条形图 应用场景介绍 交互式条形图广泛应用于数据可视化和分析领域。它可以直观地展示不同类别或分组之间的数值差异,并允许用户通过交互操作探索数据。 代码基本功能介…

【学习css2】grid布局-页面footer部分保持在网页底部

中间内容高度不够屏幕高度撑不开的页面时候&#xff0c;页面footer部分都能保持在网页页脚&#xff08;最底部&#xff09;的方法 1、首先上图看显示效果 2、奉上源码 2.1、html部分 <body><header>头部</header><main>主区域</main><foot…