2017-06-14 5 views
0

Ich habe eine aktive Klasse. Das läuft die Login-Seite. Ich klicke auf eine Schaltfläche, um ein QWidget aufzurufen, das ich für eine Bildschirmtastatur programmiert habe. Und ich habe zu dem Teil, wo alles was ich damit zu tun habe, den aktuellen Text aus einem QLineEdit herausholt und diesen Text entsprechend der Taste, die auf der Tastatur gedrückt wurde, aktualisiert. Die Tastatur ist eine separate Klasse, und ich habe eine Funktion innerhalb meiner LoginPage, die den Text aus dem QLineEdit holen sollte, aber wenn ich versuche, diese Funktion von einer anderen Klasse auszuführen, bekomme ich einen Fehler: TypeError: 'bool' Objekt ist nicht aufrufbarPython: Funktion von einer aktiven Klasse aufrufen

Jetzt kann ich davon ausgehen, dass dieser Fehler ist, weil die Klasse aktiv ist, und um die Funktion innerhalb dieser Klasse von einer anderen Klasse aufzurufen, muss die Klasse erneut aufgerufen werden, was nicht möglich ist, wenn es bereits ist aktiv. Wie also würde ich diese Funktion von einer anderen Klasse aufrufen, während die Funktion in einer aktiven Klasse ist. Oder gibt es eine andere Lösung?

Ja meine Tastatur ist nicht wirklich Teil des aktuellen Fensters, es läuft separat, so dass es über das Programm

SomeCode universal ist: (entfernt Irrelevant Code wie Layout und Formatierung): Ignoriere Vertiefung Fehler als auch

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 

Jede Hilfe wäre sehr geschätzt! Danke

Hinweise: GetAttr Methode nicht entweder

Antwort

2

Wenn Sie

Login = self.LoginCheck() 

laufen Sie den Namen Login auf das Ergebnis des Aufrufs self.LoginCheck() setzen, die scheinbar einen Booleschen Wert zurück.

Dann später haben Sie

Login() 

Seit Login nun auf eine boolean bezieht, wird dies nicht funktionieren.

Verwenden Sie einen anderen Variablennamen für Login. Sie sollten sowieso keine Großbuchstaben für Variablennamen verwenden.

+0

Got it!Ich weiß nicht, wie ich das nicht gesehen habe, Danke, auch ich hatte immer die Angewohnheit, Großbuchstaben zu benutzen und ich dachte, ich sollte es sowieso nicht tun, also sprach ich mit meinen Computerlehrern darüber, aber sie sagten, es sei nicht Es ist egal, es sei denn, es stört die Sprache. –

0

Wegen der Login = self.LoginCheck() funktioniert, wo Sie die Login als boolean gesetzt. Sie sollten den Variablennamen ändern.

0

Sie überschreiben Ihre Login Klasse in Ihrer Funktion. Wenn Sie das tun:

Login = self.LoginCheck() 

Anmeldung ist nun eine Variable, die das Ergebnis der self.LoginCheck()

enthält würde ich die Zuordnung entfernen, und prüfen Sie nur das Ergebnis dieser Methode in Ihrer if Aussage.

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 
+0

Ich habe die Variable Login = LoginCheck() umbenannt und es wurden Dinge behoben, die gerade versuchten, die GetText-Funktion zu reparieren. –

Verwandte Themen