尝试评估文本框中的答案,如果无法回答也返回错误

时间:2018-09-29 09:49:37

标签: python

我们正在为我们的课堂项目制作计算器,而我遇到了麻烦。我正在尝试帮助我的朋友制作计算器,我建议他使用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

如果您能启发我们,那就太好了

1 个答案:

答案 0 :(得分:1)

python不会隐式定义对象变量。因此,在root中将__init__传递给构造函数时,并不意味着root可用作author的变量(因为在这种情况下,root不是参数)。但是,传递给构造函数的同一self对象也传递给author方法。