【问题标题】:Attribute error python tkinter属性错误python tkinter
【发布时间】:2015-11-20 03:30:33
【问题描述】:

我正在尝试使用一个类来制作一个计算器,并且(我对此很陌生)这段代码一直告诉我 AttributeError: 'Calculator' object has no attribute 'clear',当我运行我的代码时,类中的所有内容都没有不行。我可以做些什么来修复我的代码?

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, ".")

【问题讨论】:

  • 你应该把你所有的函数放在 __init__() 函数之外。
  • 我把它们都移到了外面,但现在我的 eval 函数不起作用,每次我输入我的方程并按等于时,它总是说“输入无效”加上我刚刚输入的任何内容

标签: python tkinter attributeerror


【解决方案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()

【讨论】:

  • 为什么我的 eval 不再起作用了?我完全遵循了这一点,每当我输入数字时,当我按下等于时,我的计算就会给我无效的输入
  • 您只是得到了需要将其设置回 self.results 的结果
  • 对不起,我不明白...我以为我的评估会负责计算?我需要做什么才能再次计算条目?
  • 它现在可以工作,但它并没有清除我刚刚输入的等式,例如,如果我输入 63 + 2 然后点击“=”它会给我 6563 +2
  • 不,实际上缩进也有点不对。
猜你喜欢
  • 2021-07-24
  • 2018-08-28
  • 1970-01-01
  • 2016-04-17
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多