Как использовать функцию math.sqrt повторно мой GUI? - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь добавить функцию math.sqrt в мой калькулятор py 2.7. Вот функция, которую я использую:

from Tkinter import *
from math import *

class calculator:
    def __init__(self, master):
        master.title("Simple Calculator")
        self.display = Entry(master)
        self.display.grid(columnspan = 8, ipadx = 60, ipady = 10)
        Button(master, text = "sqrt", fg = 'white', bg = 'black', 
               command = lambda:self.sqroot(), height =1, width = 10).grid(row = 6, column = 1)

def sqroot(self):
    try:
        self.s=self.display.get()
        self.sqroot=sqrt(eval(self.s))
        self.display.delete(0,END)
        self.display.insert(0,self.sqroot)
    except:
        self.display.delete(0,END)
        self.display.insert(0,'Invalid operation')

В полученном графическом интерфейсе я могу правильно использовать кнопку «sqrt» только один раз. Я получаю следующее сообщение об ошибке во второй раз:

TypeError: 'float' object is not callable

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы можете заставить его работать так. Проблема была в том, что self.sqroot = sqrt(eval(self.s)) превращает self.sqroot в строку. Чтобы избежать проблемы, код ниже просто хранит его во временной переменной с именем result. Также обратите внимание, что вы также можете сделать что-то подобное с self.s, поскольку его значение требуется только временно внутри метода.

Примечание Я также изменил ваш код, чтобы он больше соответствовал PEP 8 - Руководству по стилю для кода Python .

from Tkinter import *
from math import *

class calculator:
    def __init__(self, master):
        master.title("Simple Calculator")
        self.display = Entry(master)
        self.display.grid(columnspan=8, ipadx=60, ipady=10)
        Button(master, text="sqrt", fg='white', bg='black',
               command=lambda: self.sqroot(), height=1, width=10).grid(row=6, column=1)

    def sqroot(self):
        try:
            self.s = self.display.get()
#            self.sqroot = sqrt(eval(self.s))
            result = sqrt(eval(self.s))
            self.display.delete(0, END)
#            self.display.insert(0, self.sqroot)
            self.display.insert(0, result)
        except:
            self.display.delete(0, END)
            self.display.insert(0, 'Invalid operation')

root = Tk()
calculator(root)
root.mainloop()
0 голосов
/ 07 ноября 2018

calculator.sqroot изначально является функцией (нужной вам функцией).

Затем, для используемого вами калькулятора, вы меняете ссылку на функцию self.sqroot на ссылку с плавающей точкой self.sqroot=sqrt(eval(self.s)). Когда вы пытаетесь вызвать эту ссылку с плавающей точкой, как если бы она была функцией, python получает исключение-y.

Так что не маскируйте имена, которые вы уже использовали, и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...