在 Python Tkinter 计算器中,用户需要能够通过退格键删除最后一个数字或符号,清除按钮可以清除整个方程式,退出键可以退出程序。然而,在给定代码中,退格键只能删除数字前面的符号,而不能删除数字本身。此外,没有清除按钮和退出键。
解决方案
为了解决这些问题,需要修改给定代码。以下是解决方案:
1. 添加退格键
def backspaceAction(self):
text = self.input.get()
if len(text) > 0:
self.input.delete(len(text) - 1, END)
将此函数添加到 App 类中,并在 btn_frame 中为退格键添加一个按钮,如下所示:
btnback = button(self.btn_frame, "Back", self.backspaceAction)
# ...
# 其他按键的代码
# ...
2. 添加清除按钮
def clearAction(self):
self.input.delete(0, END)
将此函数添加到 App 类中,并在 btn_frame 中为清除按钮添加一个按钮,如下所示:
btnclear = button(self.btn_frame, "C", self.clearAction)
# ...
# 其他按键的代码
# ...
3. 添加退出键
def quitAction(self):
root.destroy()
将此函数添加到 App 类中,并在 calc_frame 中为退出按钮添加一个按钮,如下所示:
self.btnquit = button(calc_frame, "Quit", self.quitAction)
self.btnquit.pack(side=RIGHT)
完整的代码如下:
from tkinter import *
from tkinter.font import Font
def button(frame, text, command=None):
ft = Font(family=('Verdana'), size=14)
return Button(frame, text=text, font=ft, width=3, command=command)
def frame(frame, side=LEFT, bg="black"):
f = Frame(frame, background=bg, padx=5, pady=5)
f.pack(side=side, expand=YES, fill=BOTH)
return f
class App:
def __init__(self, tk):
ft = Font(family=('Verdana'), size=14)
main = frame(tk)
l_frame = frame(main)
r_frame = frame(main)
calc_frame = frame(l_frame)
self.input = Entry(calc_frame, font=ft, width=15, background="white")
self.input.pack(side=TOP)
self.btn_frame = frame(calc_frame)
x, y = 0, 0
for key in ("()%C", "+-*/", "1234", "5678", "90.="):
for c in key:
if c == "=":
btn = button(self.btn_frame, c, self.equalAction)
elif c == "C":
btn = button(self.btn_frame, c, self.cleanAction)
elif c == "Back":
btn = button(self.btn_frame, c, self.backspaceAction)
else:
btn = button(self.btn_frame, c, lambda i=c: self.input.insert(INSERT, i))
btn.grid(row=x, column=y)
y += 1
x += 1
y = 0
self.log = Text(r_frame, font=Font(family=('Verdana'), size=10), width=25, height=14, background="yellow")
self.log.pack(side=RIGHT)
self.btnquit = button(calc_frame, "Quit", self.quitAction)
self.btnquit.pack(side=RIGHT)
def backspaceAction(self):
text = self.input.get()
if len(text) > 0:
self.input.delete(len(text) - 1, END)
def cleanAction(self):
self.input.delete(0, END)
def equalAction(self):
tmp = self.input.get()
try:
result = tmp + "=" + str(eval(tmp))
self.log.insert(1.0, result + "\n");
print(result)
except Exception:
self.log.insert(1.0, "Wrong expression\n");
def quitAction(self):
root.destroy()
if __name__ == '__main__':
root = Tk()
root.title("Calculator")
root.geometry()
app = App(root)
root.mainloop()