我们正在为我们的课堂项目制作计算器,而我遇到了麻烦。我正在尝试帮助我的朋友制作计算器,我建议他使用eval()评估文本框中的内容并返回答案,而如果无法回答(例如有人输入字母),则返回一个错误框。
这是整个代码段(是的,我知道它效率极低,我们只需要通过):
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
list_screen = []
class Calculator(object):
def __init__(self,root):
self.root = root
self.screen = StringVar()
self.screen.set("")
self.symbol = StringVar()
self.symbol.set("")
self.display = Entry(root, justify=RIGHT, textvariable=self.screen)
self.display.grid(column=0, row=0, columnspan=4, sticky=[N,S,E,W])
self.author = Button(root, text="i", bg="yellow", command=self.author)
self.author.grid(column=2, row=1, sticky=[N,S,E,W])
self.ce = Button(root, text="CE", bg="yellow", command=self.ce)
self.ce.grid(column=0, row=1, columnspan=2, sticky=[N,S,E,W])
self.plus = Button(root, text="+", bg="yellow", command=self.add_plus)
self.plus.grid(column=3, row=1, sticky=[N,S,E,W])
self.seven = Button(root, text="7", bg="light blue", command=self.add_seven)
self.seven.grid(column=0, row=2, sticky=[N,S,E,W])
self.eight = Button(root, text="8", bg="light blue", command=self.add_eight)
self.eight.grid(column=1, row=2, sticky=[N,S,E,W])
self.nine = Button(root, text="9", bg="light blue", command=self.add_nine)
self.nine.grid(column=2, row=2, sticky=[N,S,E,W])
self.minus = Button(root, text="-", bg="yellow", command=self.add_minus)
self.minus.grid(column=3, row=2, sticky=[N,S,E,W])
self.four = Button(root, text="4", bg="light blue", command=self.add_four)
self.four.grid(column=0, row=3, sticky=[N,S,E,W])
self.five = Button(root, text="5", bg="light blue", command=self.add_five)
self.five.grid(column=1, row=3, sticky=[N,S,E,W])
self.six = Button(root, text="6", bg="light blue", command=self.add_six)
self.six.grid(column=2, row=3, sticky=[N,S,E,W])
self.times = Button(root, text="*", bg="yellow", command=self.add_times)
self.times.grid(column=3, row=3, sticky=[N,S,E,W])
self.one = Button(root, text="1", bg="light blue", command=self.add_one)
self.one.grid(column=0, row=4, sticky=[N,S,E,W])
self.two = Button(root, text="2", bg="light blue", command=self.add_two)
self.two.grid(column=1, row=4, sticky=[N,S,E,W])
self.three = Button(root, text="3", bg="light blue", command=self.add_three)
self.three.grid(column=2, row=4, sticky=[N,S,E,W])
self.divide = Button(root, text="/", bg="yellow", command=self.add_divide)
self.divide.grid(column=3, row=4, sticky=[N,S,E,W])
self.zero = Button(root, text="0", bg="light blue", command=self.add_zero)
self.zero.grid(column=0, row=5, sticky=[N,S,E,W])
self.decimal = Button(root, text=".", bg="light blue", command=self.add_decimal)
self.decimal.grid(column=1, row=5, sticky=[N,S,E,W])
self.equal = Button(root, text="=", bg="light green", command=self.answer)
self.equal.grid(column=2, row=5, columnspan=2, sticky=[N,S,E,W])
def ce(self):
self.screen.set("")
def author(self):
root = Tk()
root.title("Information")
amount_label = Label(root, text="Created by Finn Harrison")
amount_label.pack()
root.mainloop()
def answer(self):
self.equation = self.screen.get()
self.equation = self.equation.replace("%", "/ 100")
try:
self.answer = eval(self.equation)
self.screen(self.answer)
except:
messagebox.showinfo("INVALID", "Error, make sure you aren't using invalid syntax", icon="warning", parent=root)
def add_plus(self):
self.display.insert(END, "+")
def add_seven(self):
self.display.insert(END, "7")
def add_eight(self):
self.display.insert(END, "8")
def add_nine(self):
self.display.insert(END, "9")
def add_minus(self):
self.display.insert(END, "-")
def add_four(self):
self.display.insert(END, "4")
def add_five(self):
self.display.insert(END, "5")
def add_six(self):
self.display.insert(END, "6")
def add_times(self):
self.display.insert(END, "*")
def add_one(self):
self.display.insert(END, "1")
def add_two(self):
self.display.insert(END, "2")
def add_three(self):
self.display.insert(END, "3")
def add_divide(self):
self.display.insert(END, "/")
def add_zero(self):
self.display.insert(END, "0")
def add_decimal(self):
self.display.insert(END, ".")
def calc():
root = Tk()
calc = Calculator(root)
root.mainloop()
calc()
问题似乎出在:
def answer(self):
self.equation = self.screen.get()
self.equation = self.equation.replace("%", "/ 100")
try:
self.answer = eval(self.equation)
self.screen(self.answer)
except:
messagebox.showinfo("INVALID", "Error, make sure you aren't using invalid syntax", icon="warning", parent=root)
它给了我们错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\maxhi\Downloads\Finn H Calculator.py", line 93, in answer
self.screen(self.answer)
TypeError: 'StringVar' object is not callable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\maxhi\AppData\Local\Programs\Python\Python37-
32\lib\tkinter\__init__.py", line 1702, in __call__
return self.func(*args)
File "C:\Users\maxhi\Downloads\Finn H Calculator.py", line 95, in answer
messagebox.showinfo("INVALID", "Error, make sure you aren't using invalid
syntax", icon="warning", parent=root)
NameError: name 'root' is not defined
如果您能启发我们,那就太好了
答案 0 :(得分:1)
python不会隐式定义对象变量。因此,在root
中将__init__
传递给构造函数时,并不意味着root
可用作author
的变量(因为在这种情况下,root
不是参数)。但是,传递给构造函数的同一self
对象也传递给author
方法。