user6534233
user6534233

Reputation:

Python: Calling function from an active class

I've got an active class. That's running the login page. I click a button to bring up a QWidget, which I've coded to be an onscreen keyboard. And I've got to the part where all I've got left to do with it is pull the current text from a QLineEdit, and then update that text according to what button was pressed on the keyboard. The Keyboard is a seperate class, and I've got a function within my LoginPage that should grab the text from the QLineEdit, but when trying to run that function from another class, I get an error: TypeError: 'bool' object is not callable

Now I can assume that this error is because the class is active, and in order to call the function within this class from another class, the class has to be called again, which it can't when it's already active. So how would I go about calling this function from another class while the function is in an active class. Or is there another solution.

Yes my keyboard isn't actually part of the current window, it runs seperately so it's universal across the program

SomeCode:(Removed Irrelevant code such as layout and formatting) : Ignore indentation errors as well

class Login(QtGui.QWidget):
    clicked =QtCore.pyqtSignal() #Signal emitter
    def __init__(self, parent=None): #Constructor
        super(Login, self).__init__()
        self.initUI()

def initUI(self):
    self.EFilter = Filter()

    TitleFont = QtGui.QFont()

    SubFont = QtGui.QFont()

    Title = QtGui.QLabel("SECRET ;)")

    LoginL = QtGui.QLabel("Username")

    PassL = QtGui.QLabel("Password")

    self.LoginE = QtGui.QLineEdit()
    self.LoginE.setObjectName("LoginE")
    self.LoginE.installEventFilter(self.EFilter)
    self.PassE = QtGui.QLineEdit()
    self.PassE.setObjectName("PassE")
    self.PassE.installEventFilter(self.EFilter)

    LoginB = QtGui.QPushButton("Login")

    Keyboard = QtGui.QPushButton("Keyboard")
    Keyboard.clicked.connect(self.KeyCall)

    self.setLayout(NewLayout)

    LoginB.clicked.connect(self.LoginRoutine)

def LoginRoutine(self):
    User = self.LoginE.text()
    Pass = self.PassE.text()
    if User == "Admin":
        self.parent().parent().AdminSet()
        self.LoginE.clear()
        self.PassE.clear()

def KeyCall(self):
    self.Key = Keyboard(self)

def GiveText(self, widget):
    Var = eval("self."+widget+".text()")
    return Var




  class Keyboard(QtGui.QWidget):
    clicked = QtCore.pyqtSignal()
    def __init__(self, parent):
        super(Keyboard, self).__init__()
        self.initUI()

    def initUI(self):
        #Removed All Buttons, just pointless things not needed to see
        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
        self.setFocusPolicy(QtCore.Qt.NoFocus)
        self.setFixedSize(750, 250)
        self.setWindowTitle("Keyboard")
        self.show()

    def Capitalise(self):
        #This just capitalises buttons nothing relevent here
        #self.Capital also comes from here

    def Clicked(self):
        self.Counter = 0
        self.Name = Store(self)
        self.Found = False
        Login = self.LoginCheck()
        if Login == True:
            if self.Capital == True:
                Char = str(self.sender().text())    
                #Important Thing: THIS WHERE ERROR IS ;)
                OldText = Login().GetText(str(self.Name)) 
                print (OldText) #JUST CHECKING IF IT WORKS WHEN ITS CALLED
            #More Irrelevant stuff gone

    def LoginCheck(self):
        #Boring algorithm stuff to check whether the variable is in this class

    def AdminCheck(self):
        #Boring algorithm stuff to check whether the variable is in this class

class Filter(QtCore.QObject):
    #Typical event filter nothing special

class Store(Filter):
    #More boring alogrithm stuff for transfering data between classes

Full Error:

Traceback (most recent call last):
File "Blahblahblah", line 952, in Clicked
OldText = Login().GetText(str(self.Name))
TypeError: 'bool' object is not callable

Any help would be appreciated greatly! Thank you

Notes: GetAttr method doesn't work either

Upvotes: 0

Views: 466

Answers (3)

DavidS
DavidS

Reputation: 276

Because of the Login = self.LoginCheck() where you set the Login as boolean. You should change the variable name.

Upvotes: 0

alxwrd
alxwrd

Reputation: 2470

You are overwriting your Login class inside your function. When you do:

Login = self.LoginCheck()

Login is now a variable which contains the result of self.LoginCheck()

I would remove the assignment, and just check the result of this method in your if statement.

def Clicked(self):
    self.Counter = 0
    self.Name = Store(self)
    self.Found = False
    if self.LoginCheck():
        if self.Capital == True:
            Char = str(self.sender().text())    
            #Important Thing: THIS WHERE ERROR IS ;)
            OldText = Login().GetText(str(self.Name)) 
            print (OldText) #JUST CHECKING IF IT WORKS WHEN ITS CALLED

Upvotes: 0

khelwood
khelwood

Reputation: 59186

When you run

Login = self.LoginCheck()

you are setting the name Login to the result of calling self.LoginCheck(), which apparently returns a boolean.

Then later you have

Login()

Since Login now refers to a boolean, this won't work.

Use a different variable name for Login. You shouldn't be using capital letters for variable names anyway.

Upvotes: 2

Related Questions