2015-08-26 3 views
1

Я пытаюсь сделать калькулятор с помощью класса и (Im совершенно новый для этого) этот код продолжает говорить мне AttributeError: объект «Calculator» не имеет атрибута «clear» и когда я запускаю свой код, все внутри класса не работает. Что я могу сделать, чтобы исправить свой код?Ошибка атрибута python tkinter

class Calculator(Frame): 
    def __init__(self): 
     Frame.__init__(self) 
     display = Frame(calculator, bd=0, width=1000, height=1000, relief=SUNKEN) 
     buttons = Frame(calculator, bd=0, width=7, height=1, relief=GROOVE) 
     display.grid(column=0, row=0, padx=0, pady=0) 
     buttons.grid(column=0, row=1, padx=1) 
     numbers = StringVar() 
     results = Entry(display, textvariable=numbers, width=31, fg="DarkOrchid4", bg="lavender blush", font="Verdana") 
     results.pack() 
     results.grid(column=0, row=0) 

     def showup(x): 
      return lambda: results.insert(END, x) 

     def equals(self): 
      try: 
       result = eval(results.get()) 
      except: 
       result = "Invalid input" 
       self.all_clear 
       results.insert(0, result) 
     def zero(self): 
      results.insert(END, "0") 
     def bracket_one(self): 
      results.insert(END, "(") 
     def bracket_two(self): 
      results.insert(END, ")") 
     def all_clear(self): 
      results.delete(0, END) 
     def clear(self): 
      results.delete(-1) 
     def multiplication(self): 
      results.insert(END, "x") 
     def division(self): 
      results.insert(END, "/") 
     def addition(self): 
      results.insert(END, "+") 
     def subtraction(self): 
      results.insert(END, "-") 
     def decimal_point(self): 
      results.insert(END, ".") 
+0

Вы должны поместить все свои функции за пределами функции __init __(). – Hugo

+0

Я переместил их всех на улицу, но теперь моя функция eval не работает, каждый раз, когда я печатаю свое уравнение и нажимаю, он всегда говорит «Недействительный ввод» плюс все, что я только что напечатал в –

ответ

1

Ваши отступы в class Calculator(Frame): неправильно, вы отступ всех методов внутри __init__() вместо внутри класса. Уменьшите отступ для таких методов, как - equals(self), zero(self) и т. Д., И переместите их за пределы __init__().

Кроме того, вы должны поместить results в качестве переменной экземпляра. И доступ к нему как переменной экземпляра - self.results.

Пример -

from tkinter import * 
from tkinter import messagebox 
calculator = Tk() 
calculator.title("Calcualtor") 
calculator.geometry("317x145") 

menubar = Menu(calculator) 

class Calculator(Frame): 
    def __init__(self): 
     Frame.__init__(self) 
     display = Frame(calculator, bd=0, width=1000, height=1000, relief=SUNKEN) 
     buttons = Frame(calculator, bd=0, width=7, height=1, relief=GROOVE) 
     display.grid(column=0, row=0, padx=0, pady=0) 
     buttons.grid(column=0, row=1, padx=1) 
     numbers = StringVar() 
     self.results = Entry(display, textvariable=numbers, width=31, fg="DarkOrchid4", bg="lavender blush", font="Verdana") 
     self.results.pack() 
     self.results.grid(column=0, row=0) 

     def showup(x): 
      return lambda: self.results.insert(END, x) 

     numbers=["7", "4", "1", "8", "5", "2", "9", "6", "3"] 
     for i in range(9): 
      n=numbers[i] 
      Button(buttons, bg="snow", text=n, width=7, height=1, command=showup(n), relief=RAISED).grid(row=i%3, column=i//3) 

     Clear = Button(buttons, bg="snow", text="C", width=7, height=1, command=self.clear, relief=RAISED) 
     Clear.grid(padx=2, pady=2, column=3, row=0) 
     All_clear = Button(buttons, bg="snow", text="AC", width=7, height=1, command=self.all_clear, relief=RAISED) 
     All_clear.grid(padx=2, pady=2, column=4, row=0) 
     Bracket_one = Button(buttons, bg="snow", text="(", width=7, height=1, command=self.bracket_one, relief=RAISED) 
     Bracket_one.grid(padx=2, pady=2, column=2, row=3) 
     Bracket_two = Button(buttons, bg="snow", text=")", width=7, height=1, command=self.bracket_two, relief=RAISED) 
     Bracket_two.grid(padx=2, pady=2, column=3, row=3) 
     Zero = Button(buttons, bg="snow", text="0", width=7, height=1, command=self.zero, relief=RAISED) 
     Zero.grid(padx=2, pady=2, column=0, row=3) 
     Decimal_point = Button(buttons, bg="snow", text=".", width=7, height=1, command=self.decimal_point, relief=RAISED) 
     Decimal_point.grid(padx=2, pady=2, column=1, row=3) 
     Multiplication = Button(buttons, bg="red", text="x", width=7, height=1, command=self.multiplication, relief=RAISED) 
     Multiplication.grid(padx=2, pady=2, column=3, row=1) 
     Division = Button(buttons, bg="powder blue", text="/", width=7, height=1, command=self.division, relief=RAISED) 
     Division.grid(padx=2, pady=2, column=4, row=1) 
     Addition = Button(buttons, bg="yellow", text="+", width=7, height=1, command=self.addition, relief=RAISED) 
     Addition.grid(padx=2, pady=2, column=3, row=2) 
     Subtraction = Button(buttons, bg="green", text="-", width=7, height=1, command=self.subtraction, relief=RAISED) 
     Subtraction.grid(padx=2, pady=2, column=4, row=2) 
     Equals = Button(buttons, bg="orange", text="=", width=7, height=1, command=self.equals, relief=RAISED) 
     Equals.grid(padx=2, pady=2, column=4, row=3) 

    def equals(self): 
     try: 
      result = eval(self.results.get()) 
     except: 
      result = "Invalid input" 
     self.all_clear() 
     self.results.insert(0, result) 
    def zero(self): 
     self.results.insert(END, "0") 
    def bracket_one(self): 
     self.results.insert(END, "(") 
    def bracket_two(self): 
     self.results.insert(END, ")") 
    def all_clear(self): 
     self.results.delete(0, END) 
    def clear(self): 
     self.results.delete(-1) 
    def multiplication(self): 
     self.results.insert(END, "x") 
    def division(self): 
     self.results.insert(END, "/") 
    def addition(self): 
     self.results.insert(END, "+") 
    def subtraction(self): 
     self.results.insert(END, "-") 
    def decimal_point(self): 
     self.results.insert(END, ".") 

if __name__ == '__main__': 
    Calculator().mainloop() 
    calculator.config(menu=menubar) 
    calculator.mainloop() 
+0

, почему мой eval больше не работает? Я последовал за этим точно, и всякий раз, когда я вводил числа, мой calc дает мне недопустимый ввод, когда я нажимаю равный –

+0

. Вы просто получаете результат, который вам нужно будет вернуть обратно к себе. Результаты –

+0

им жаль, но я не понимаю .. Я думал, что мой eval позаботится о расчетах? Что мне нужно будет сделать, чтобы он снова подсчитал записи? –