Tkinter计算器等号计算后输入新数字自动清空Text组件方法
Tkinter计算器等号计算后自动清空旧结果实现
初始项目代码
text = "" e = Text(window, width = 15, height = 2, font = ("Times New Roman", 24)) e.grid(column = 0, row = 0, columnspan=5) def show_value(val): # Displays the text when user clicks buttons global text text+=str(val) e.insert(END, val) def clear(): # Clears what's inside the text frame global text e.delete("1.0", "end") text = "" def delete(): # Deletes the last value/character e.delete("end-2c") def equal(): # Computes global text try: text = str(eval(text)) e.delete("1.0", "end") e.insert("1.0", text) except: clear() e.insert("1.0", "Error") #Buttons # button_negative = Button(window, text = "+/-", width = 6, font = ("Arial", 10)) # ADD THIS SOON button_zero = Button(window, text = "0", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(0)) button_one = Button(window, text = "1", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(1)) button_two = Button(window, text = "2", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(2)) button_three = Button(window, text = "3", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(3)) button_four = Button(window, text = "4", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(4)) button_five = Button(window, text = "5", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(5)) button_six = Button(window, text = "6", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(6)) button_seven = Button(window, text = "7", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(7)) button_eight = Button(window, text = "8", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(8)) button_nine = Button(window, text = "9", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(9)) button_equals = Button(window, text = "=", width = 6, font = ("Arial", 10), bg = "#7C3D00", fg = "white", command = equal) button_decimal = Button(window, text = ".", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(".")) button_add = Button(window, text = "+", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value("+")) button_subtract = Button(window, text = "-", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value("-")) button_divide = Button(window, text = "/", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value("/")) button_multiply = Button(window, text = "*", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value("*")) button_clear = Button(window, text = "AC", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = clear) button_delete = Button(window, text = "DEL", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = delete) button_left_bracket = Button(window, text = "(", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value("(")) button_right_bracket = Button(window, text = ")", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(")")) #button_negative.grid(row = 7, column = 0) button_zero.grid(row = 7, column = 0) button_decimal.grid(row = 7, column = 1) button_equals.grid(row = 7, column = 3) button_delete.grid(row = 7, column = 2) button_one.grid(row = 5, column = 0) button_two.grid(row = 5, column = 1) button_three.grid(row = 5, column = 2) button_add.grid(row = 5, column = 3) button_four.grid(row = 4, column = 0) button_five.grid(row = 4, column = 1) button_six.grid(row = 4, column = 2) button_subtract.grid(row = 4, column = 3) button_seven.grid(row = 3, column = 0) button_eight.grid(row = 3, column = 1) button_nine.grid(row = 3, column = 2) button_multiply.grid(row = 3, column = 3) button_clear.grid(row = 2, column = 0) button_left_bracket.grid(row = 2, column = 1) button_right_bracket.grid(row = 2, column = 2) button_divide.grid(row = 2, column = 3) window.mainloop()
待解决问题
按下等号输出计算结果后,直接输入新计算内容会拼接在旧结果之后,必须手动点击AC按钮清空才能开始新计算。需要实现效果:等号输出结果后,无需手动点击全清按钮,用户按下新数字/小数点时自动清空历史结果,直接输入新计算内容;如果按下运算符/括号,则保留当前结果继续拼接运算。
实现步骤
- 新增全局状态标记
after_equal,用来标识当前是否刚完成等号计算、结果已显示的状态,初始值设为False - 修改
equal函数,成功输出计算结果/报错后,将after_equal设为True - 修改
show_value函数,进入函数时先判断:如果当前处于after_equal状态,且输入内容是数字或小数点,先执行清空操作,再重置after_equal为False后插入新值;如果输入内容是运算符或括号,直接重置after_equal为False后在现有结果后拼接内容即可 - 修改
clear和delete函数,执行操作时同步将after_equal重置为False,避免状态异常
修改后完整代码
text = "" after_equal = False # 新增:标记是否刚完成等号计算 e = Text(window, width = 15, height = 2, font = ("Times New Roman", 24)) e.grid(column = 0, row = 0, columnspan=5) def show_value(val): # Displays the text when user clicks buttons global text, after_equal # 等号后输入数字/小数点自动清空 if after_equal: if str(val) in "0123456789.": clear() after_equal = False text+=str(val) e.insert(END, val) def clear(): # Clears what's inside the text frame global text, after_equal e.delete("1.0", "end") text = "" after_equal = False def delete(): # Deletes the last value/character global after_equal e.delete("end-2c") after_equal = False def equal(): # Computes global text, after_equal try: text = str(eval(text)) e.delete("1.0", "end") e.insert("1.0", text) except: clear() e.insert("1.0", "Error") after_equal = True # 计算完成后标记状态 # 按钮定义、布局代码和初始版本完全一致,无需修改 button_zero = Button(window, text = "0", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(0)) button_one = Button(window, text = "1", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(1)) button_two = Button(window, text = "2", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(2)) button_three = Button(window, text = "3", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(3)) button_four = Button(window, text = "4", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(4)) button_five = Button(window, text = "5", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(5)) button_six = Button(window, text = "6", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(6)) button_seven = Button(window, text = "7", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(7)) button_eight = Button(window, text = "8", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(8)) button_nine = Button(window, text = "9", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(9)) button_equals = Button(window, text = "=", width = 6, font = ("Arial", 10), bg = "#7C3D00", fg = "white", command = equal) button_decimal = Button(window, text = ".", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(".")) button_add = Button(window, text = "+", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value("+")) button_subtract = Button(window, text = "-", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value("-")) button_divide = Button(window, text = "/", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value("/")) button_multiply = Button(window, text = "*", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value("*")) button_clear = Button(window, text = "AC", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = clear) button_delete = Button(window, text = "DEL", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = delete) button_left_bracket = Button(window, text = "(", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value("(")) button_right_bracket = Button(window, text = ")", width = 6, font = ("Arial", 10), bg = "black", fg = "white", command = lambda: show_value(")")) button_zero.grid(row = 7, column = 0) button_decimal.grid(row = 7, column = 1) button_equals.grid(row = 7, column = 3) button_delete.grid(row = 7, column = 2) button_one.grid(row = 5, column = 0) button_two.grid(row = 5, column = 1) button_three.grid(row = 5, column = 2) button_add.grid(row = 5, column = 3) button_four.grid(row = 4, column = 0) button_five.grid(row = 4, column = 1) button_six.grid(row = 4, column = 2) button_subtract.grid(row = 4, column = 3) button_seven.grid(row = 3, column = 0) button_eight.grid(row = 3, column = 1) button_nine.grid(row = 3, column = 2) button_multiply.grid(row = 3, column = 3) button_clear.grid(row = 2, column = 0) button_left_bracket.grid(row = 2, column = 1) button_right_bracket.grid(row = 2, column = 2) button_divide.grid(row = 2, column = 3) window.mainloop()
该逻辑和主流实体计算器行为一致:算出结果后按数字/小数点直接开新计算,按运算符则直接用当前结果继续运算,不需要额外手动清空。原代码中
delete函数未同步更新全局text变量,删除字符后计算会出现逻辑错误,可自行补充该部分逻辑修复。
内容的提问来源于stack exchange,提问作者Hahaha2411
相关产品推荐
相关产品推荐

