如何在 Python 中創建一個類似于 MS 計算器的 GUI 計算器

在這里插入圖片描述

  1. 問題背景

假設我們需要創建一個類似于微軟計算器的 GUI 計算器。這個計算器應該具有以下功能:

  • 能夠顯示第一個輸入的數字。
  • 當按下運算符時,輸入框仍顯示第一個數字。
  • 當按下第二個數字時,第一個數字被替換。
  1. 解決方案

為了解決這個問題,我們需要使用狀態的概念。每次按下按鍵時,檢查狀態并確定要采取的操作。

  • 起始狀態:輸入數字。
  • 當按下運算符按鈕時:存儲運算符,改變狀態。
  • 當按下另一個數字時:存儲數字,清除數字輸入,重新開始數字輸入。
  • 當按下等號按鈕時:使用存儲的數字和運算符以及數字輸入中的當前數字,執行操作。

使用動態語言,例如 Python,可以改變處理按鍵/按鈕按下事件的函數,而不是使用變量和 if 語句來檢查狀態。

import tkinter as tkclass 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()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/45070.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/45070.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/45070.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為OD機考題(HJ108 求最小公倍數)

前言 經過前期的數據結構和算法學習,開始以OD機考題作為練習題,繼續加強下熟練程度。 描述 正整數A和正整數B 的最小公倍數是指 能被A和B整除的最小的正整數值,設計一個算法,求輸入A和B的最小公倍數。 數據范圍:1≤…

Spring中的適配器模式和策略模式

1. 適配器模式的應用 1.1適配器模式(Adapter Pattern)的原始定義是:將一個類的接口轉換為客戶期望的另一個接口,適配器可以讓不兼容的兩個類一起協同工作。 1.2 AOP中的適配器模式 在Spring的AOP中,使用Advice&#…

【北京迅為】《i.MX8MM嵌入式Linux開發指南》-第一篇 嵌入式Linux入門篇-第十九章 Linux 工具之make 工具和 makefile 文件

i.MX8MM處理器采用了先進的14LPCFinFET工藝,提供更快的速度和更高的電源效率;四核Cortex-A53,單核Cortex-M4,多達五個內核 ,主頻高達1.8GHz,2G DDR4內存、8G EMMC存儲。千兆工業級以太網、MIPI-DSI、USB HOST、WIFI/BT…

集群管理腳本

虛擬機集群管理腳本 文章目錄 虛擬機集群管理腳本一、遠程調用腳本(remote_call.sh)二、遠程復制目錄腳本(remote_copy.sh) 一、遠程調用腳本(remote_call.sh) 如果有傳命令參數,則執行該命令;如果沒有傳命令參數,則不執行。 #!/bin/bashcm…

【嵌入式Linux】<知識點> GDB調試(更新中)

文章目錄 前言 一、GDB調試預備工作 二、GDB的啟動與退出 三、GDB中查看源代碼 四、GDB斷點操作 五、GDB調試指令 前言 在專欄【嵌入式Linux】應用開發篇_Linux打工仔的博客中,我們已經寫了大量的源程序。但是在調試這些程序時我們都是通過printf大法和肉眼除…

評估指標:精確率(Precision)、召回率(Recall)、F1分數(F1 Score)

評估指標:精確率(Precision)、召回率(Recall)、F1分數(F1 Score) 前言相關介紹1. 準確率(Accuracy)2. 精確率(Precision)3. 召回率(Re…

Cadence23打開與關閉飛線,修改位號絲印大小

打開與關閉所有飛線: 顯示部分飛線: 單獨顯示網絡飛線尤為好用,點擊上圖中的網絡,之后鼠標點擊器件中你想高亮的網絡即可單獨打開部分飛線。 這里的關閉部分網絡的飛線也很好用,可以臨時關閉討厭的GND飛線&#xff1a…

掌握Postman的API請求模板:一鍵生成,效率倍增

📘 掌握Postman的API請求模板:一鍵生成,效率倍增 Postman是API開發和測試的瑞士軍刀,而其請求模板功能更是提升工作效率的利器。API請求模板允許用戶定義一組可重用的請求配置,從而快速生成和發送API請求。本文將深入…

virturalBox+K8S部署jaeger-all-in-one

pod的yaml如下:這里使用的是主機host模式 apiVersion: apps/v1 kind: Deployment metadata:name: jaegerlabels:app: jaeger spec:replicas: 1selector:matchLabels:app: jaegertemplate:metadata:labels:app: jaegerspec:hostNetwork: truecontainers:- name: jae…

TF卡病毒是什么?如何防范和應對?

在存儲芯片及存儲卡領域,TF卡病毒是一個備受關注的話題。在本文中,拓優星辰將詳細解釋TF卡病毒的含義、來源以及如何防范和應對這一問題,幫助客戶更好地了解和處理TF卡病毒的風險。 1. TF卡病毒的含義 TF卡病毒是指針對TF存儲卡(T…

05:定時器中斷

中斷 1、定時器T0中斷2、案例:通過定時器T0中斷來實現燈間隔1s亮滅 1、當中央處理機CPU正在處理某件事的時候外界發生了緊急事件請求,要求CPU暫停當前的工作,轉而去處理這個緊急事件,處理完以后,再回到原來被中斷的地方…

安裝lap和cython_bbox失敗了很多次!!!終于被我發現了!

先說 lap 試了很多種方式,pip install lap / conda install -c conda-forge lap … 全失敗了后面發現 lap 不支持 python > 3.9 的版本使用 pip install lapx 成功! cython_bbox 更難了 一直提示缺少MicroSoft C 14.0 … 大家有需要自行下載&#x…

[PaddlePaddle飛槳] PaddleDetection-通用目標檢測-小模型部署

PaddleDetection的GitHub項目地址 推薦環境: PaddlePaddle > 2.3.2 OS 64位操作系統 Python 3(3.5.1/3.6/3.7/3.8/3.9/3.10),64位版本 pip/pip3(9.0.1),64位版本 CUDA > 10.2 cuDNN > 7.6pip下載指令: python -m pip i…

面向本科生的智能品牌傳播策略優化

面向本科生的智能品牌傳播策略優化 一、引言 在數字化時代,品牌傳播已不再是簡單的信息傳遞,而是需要借助智能技術實現精準、高效、創新的傳播策略。作為本科畢業生,選擇“面向本科生的智能品牌傳播策略優化實踐”作為研究課題,不僅有助于深入理解品牌傳播的理論知識,還…

【數據結構】一文了解七大排序算法

文章目錄 前言一.直接插入排序插入排序思想插入排序代碼實現插入排序總結 二.希爾排序希爾排序思想希爾排序代碼實現希爾排序總結 三.選擇排序選擇排序思想選擇排序代碼實現選擇排序總結 四.堆排序堆排序思想堆排序代碼實現堆排序總結 五、冒泡排序冒泡排序思想冒泡排序代碼實現…

Dify 與 Xinference 最佳組合 GPU 環境部署全流程

背景介紹 在前一篇文章 RAG 項目對比 之后,確定 Dify 目前最合適的 RAG 框架。本次就嘗試在本地 GPU 設備上部署 Dify 服務。 Dify 是將模型的加載獨立出去的,因此需要選擇合適的模型加載框架。調研一番之后選擇了 Xinference,理由如下&…

易我分區大師18.8.0更新:兩大功能改進

近日,易我分區大師18.8.0更新上線。此次更新重點改進了系統克隆功能,支持從第二塊系統盤(從盤)克隆系統;同時,軟件支持將分區的文件系統格式從FAT轉換成exFAT。 01、系統克隆 系統克隆功能旨在幫助用戶在…

pinia學習

conuter.ts <template><div><!-- 顯示當前的計數 --><p>Count: {{ count }}</<!-- 顯示計算的雙倍計數 --><p>Double Count: {{ doubleCount }}</p><!-- 點擊按鈕以增加計數 --><button click"increment">…

基于紅黑樹對map和set的封裝

前言 前面我們已經對紅黑樹做了介紹和實現&#xff0c;本期我們來對紅黑樹進一步改造&#xff0c;然后基于改造后的紅黑樹封裝出map和set&#xff01; 本期內容介紹 ? 紅黑樹的改造 ? 紅黑樹的迭代器實現 ? map的封裝 ? set的封裝 ? 全部源碼 ● 紅黑樹的改造 我們目前…

未來互聯網的新篇章:深度解析Facebook的技術與戰略

隨著科技的飛速發展和社會的不斷變遷&#xff0c;互聯網作為全球信息交流的重要平臺&#xff0c;正經歷著前所未有的變革和演進。作為全球最大的社交媒體平臺之一&#xff0c;Facebook不僅是人們溝通、分享和互動的重要場所&#xff0c;更是科技創新和數字化進程的推動者。本文…