Python计算器代码修改:实现运算后点击数字清空结果
问题与解决方案
问题
用Python的tkinter库编写计算器时,完成两数运算得到结果后,直接点击数字按钮,新数字会叠加在结果后(例如输入5+5得到10,点击5后显示105),需要实现此时清空结果并开始新运算。
原代码如下:
import tkinter from tkinter import * from tkinter import messagebox import math def button_1_is_Clicked(): global var var = var + "1" the_data.set(var) def button_2_is_Clicked(): global var var = var + "2" the_data.set(var) def button_3_is_Clicked(): global var var = var + "3" the_data.set(var) def button_4_is_Clicked(): global var var = var + "4" the_data.set(var) def button_5_is_Clicked(): global var var = var + "5" the_data.set(var) def button_6_is_Clicked(): global var var = var + "6" the_data.set(var) def button_7_is_Clicked(): global var var = var + "7" the_data.set(var) def button_8_is_Clicked(): global var var = var + "8" the_data.set(var) def button_9_is_Clicked(): global var var = var + "9" the_data.set(var) def button_0_is_Clicked(): global var var = var + "0" the_data.set(var) def button_Add_is_Clicked(): global A global var global operator global prevous_operator A = float(var) operator = "+" var = var + "+" the_data.set(var) def button_Sub_is_Clicked(): global A global var global operator global prevous_operator A = float(var) operator = "-" var = var + "-" the_data.set(var) def button_Mul_is_Clicked(): global A global var global operator global prevous_operator A = float(var) operator = "*" var = var + "*" the_data.set(var) def button_Div_is_Clicked(): global A global var global operator global prevous_operator A = float(var) operator = "/" var = var + "/" the_data.set(var) def button_Equal_is_Clicked(): global A global var global operator A = float(var) operator = "=" var = var + "=" the_data.set(var) def button_Sqrt_is_Clicked(): global A global var global operator global prevous_operator A=float(var) operator="sqrt" var="√"+var the_data.set(var) def button_Square_is_Clicked(): global A global var global operator A=float(var) operator="square" var=var+"*"+var the_data.set(var) def button_Percent_is_Clicked(): global A global var global operator global prevous_operator A = float(var) operator = "%" var = var + "%" the_data.set(var) def button_Inv_is_Clicked(): global A global var global operator global prevous_operator A = float(var) operator = "1/x" var = "1/"+var the_data.set(var) var = "" def button_C_is_Clicked(): global A global var global operator var = "" A = 0 operator = "" the_data.set("0") def button_PlusMinus_is_Clicked(): global A global var global operator A = float(var) operator = "+/-" var = var + "+/-" the_data.set(var) def button_MC_is_Clicked(): global A global var global operator operator = "MC" the_data.set("") def button_MR_is_Clicked(): global A global var global operator operator = "MR" the_data.set("") def button_MS_is_Clicked(): global A global var global operator operator = "MS" the_data.set("") def button_MPlus_is_Clicked(): global A global var global operator operator = "M+" the_data.set("") def button_MMinus_is_Clicked(): global A global var global operator operator = "M-" the_data.set("") def button_CE_is_Clicked(): global var var = var[:-1] if var == "": the_data.set("0") else: the_data.set(var) var = "" A = 0 operator = "" memory = 0 def res(): global A global operator global var global memory var2 = var try: if operator == "+": a = float((var2.split("+")[1])) A += a the_data.set(A) var = str(A) elif operator == "-": a = float((var2.split("-")[1])) A -= a the_data.set(A) var = str(A) var = "" elif operator == "*": a = float((var2.split("*")[1])) A *= a the_data.set(A) var = str(A) var = "" elif operator == "/": a = float((var2.split("/")[1])) if a == 0: raise ZeroDivisionError else: A /= a the_data.set(A) var = str(A) var = "" elif operator == "sqrt": if A < 0: raise ValueError("Cannot take square root of a negative number.") A = math.sqrt(A) the_data.set(A) var = str(A) var = "" elif operator == "square": a=float((var2.split("*")[1])) A*=A the_data.set(A) var = str(A) var = "" elif operator == "%": a = float(var2.split("%")[0]) A *= (a/100) the_data.set(A) var = str(A) var = "" elif operator == "1/x": if A == 0: raise ZeroDivisionError("Cannot divide by zero.") A = 1/A the_data.set(A) var = str(A) var = "" elif operator == "+/-": A = -A the_data.set(A) var = str(A) var = "" elif operator == "MC": memory = 0 elif operator == "MR": A = memory the_data.set(A) elif operator == "MS": memory = A elif operator == "M+": memory += A elif operator == "M-": memory -= A elif operator == "CE": if len(var) > 1: var = var[:-1] A = float(var) the_data.set(A) else: var = "" A = 0 the_data.set(0) except ZeroDivisionError as e: messagebox.showerror("Error", str(e)) var = "" except ValueError as e: messagebox.showerror("Error", str(e)) var = ""
解决方案
核心思路是添加一个状态变量,标记当前是否处于“刚显示运算结果”的状态。当用户点击数字按钮时,若处于该状态,则清空输入缓冲区var后再添加新数字,并重置状态;若未处于该状态,则正常追加数字。
修改后的完整代码:
import tkinter from tkinter import * from tkinter import messagebox import math # 添加状态变量:标记是否刚显示运算结果 is_result_displayed = False def button_1_is_Clicked(): global var, is_result_displayed if is_result_displayed: var = "1" is_result_displayed = False else: var = var + "1" the_data.set(var) def button_2_is_Clicked(): global var, is_result_displayed if is_result_displayed: var = "2" is_result_displayed = False else: var = var + "2" the_data.set(var) def button_3_is_Clicked(): global var, is_result_displayed if is_result_displayed: var = "3" is_result_displayed = False else: var = var + "3" the_data.set(var) def button_4_is_Clicked(): global var, is_result_displayed if is_result_displayed: var = "4" is_result_displayed = False else: var = var + "4" the_data.set(var) def button_5_is_Clicked(): global var, is_result_displayed if is_result_displayed: var = "5" is_result_displayed = False else: var = var + "5" the_data.set(var) def button_6_is_Clicked(): global var, is_result_displayed if is_result_displayed: var = "6" is_result_displayed = False else: var = var + "6" the_data.set(var) def button_7_is_Clicked(): global var, is_result_displayed if is_result_displayed: var = "7" is_result_displayed = False else: var = var + "7" the_data.set(var) def button_8_is_Clicked(): global var, is_result_displayed if is_result_displayed: var = "8" is_result_displayed = False else: var = var + "8" the_data.set(var) def button_9_is_Clicked(): global var, is_result_displayed if is_result_displayed: var = "9" is_result_displayed = False else: var = var + "9" the_data.set(var) def button_0_is_Clicked(): global var, is_result_displayed if is_result_displayed: var = "0" is_result_displayed = False else: var = var + "0" the_data.set(var) def button_Add_is_Clicked(): global A global var global operator global is_result_displayed # 点击运算符时重置状态,允许基于结果继续运算 is_result_displayed = False A = float(var) operator = "+" var = var + "+" the_data.set(var) def button_Sub_is_Clicked(): global A global var global operator global is_result_displayed is_result_displayed = False A = float(var) operator = "-" var = var + "-" the_data.set(var) def button_Mul_is_Clicked(): global A global var global operator global is_result_displayed is_result_displayed = False A = float(var) operator = "*" var = var + "*" the_data.set(var) def button_Div_is_Clicked(): global A global var global operator global is_result_displayed is_result_displayed = False A = float(var) operator = "/" var = var + "/" the_data.set(var) def button_Equal_is_Clicked(): global A global var global operator A = float(var) operator = "=" var = var + "=" the_data.set(var) def button_Sqrt_is_Clicked(): global A global var global operator global is_result_displayed is_result_displayed = False A=float(var) operator="sqrt" var="√"+var the_data.set(var) def button_Square_is_Clicked(): global A global var global operator global is_result_displayed is_result_displayed = False A=float(var) operator="square" var=var+"*"+var the_data.set(var) def button_Percent_is_Clicked(): global A global var global operator global is_result_displayed is_result_displayed = False A = float(var) operator = "%" var = var + "%" the_data.set(var) def button_Inv_is_Clicked(): global A global var global operator global is_result_displayed is_result_displayed = False A = float(var) operator = "1/x" var = "1/"+var the_data.set(var) var = "" def button_C_is_Clicked(): global A global var global operator global is_result_displayed var = "" A = 0 operator = "" is_result_displayed = False the_data.set("0") def button_PlusMinus_is_Clicked(): global A global var global operator global is_result_displayed is_result_displayed = False A = float(var) operator = "+/-" var = var + "+/-" the_data.set(var) def button_MC_is_Clicked(): global A global var global operator operator = "MC" the_data.set("") def button_MR_is_Clicked(): global A global var global operator operator = "MR" the_data.set("") def button_MS_is_Clicked(): global A global var global operator operator = "MS" the_data.set("") def button_MPlus_is_Clicked(): global A global var global operator operator = "M+" the_data.set("") def button_MMinus_is_Clicked(): global A global var global operator operator = "M-" the_data.set("") def button_CE_is_Clicked(): global var var = var[:-1] if var == "": the_data.set("0") else: the_data.set(var) var = "" A = 0 operator = "" memory = 0 def res(): global A global operator global var global memory global is_result_displayed var2 = var try: if operator == "+": a = float((var2.split("+")[1])) A += a the_data.set(A) var = str(A) is_result_displayed = True elif operator == "-": a = float((var2.split("-")[1])) A -= a the_data.set(A) var = str(A) is_result_displayed = True elif operator == "*": a = float((var2.split("*")[1])) A *= a the_data.set(A) var = str(A) is_result_displayed = True elif operator == "/": a = float((var2.split("/")[1])) if a == 0: raise ZeroDivisionError else: A /= a the_data.set(A) var = str(A) is_result_displayed = True elif operator == "sqrt": if A < 0: raise ValueError("Cannot take square root of a negative number.") A = math.sqrt(A) the_data.set(A) var = str(A) is_result_displayed = True elif operator == "square": A *= A the_data.set(A) var = str(A) is_result_displayed = True elif operator == "%": a = float(var2.split("%")[0]) A *= (a/100) the_data.set(A) var = str(A) is_result_displayed = True elif operator == "1/x": if A == 0: raise ZeroDivisionError("Cannot divide by zero.") A = 1/A the_data.set(A) var = str(A) is_result_displayed = True elif operator == "+/-": A = -A the_data.set(A) var = str(A) is_result_displayed = True elif operator == "MC": memory = 0 elif operator == "MR": A = memory the_data.set(A) elif operator == "MS": memory = A elif operator == "M+": memory += A elif operator
相关产品推荐
相关产品推荐

