【问题标题】:Python: Calling function from an active classPython:从活动类调用函数
【发布时间】:2017-06-14 10:38:59
【问题描述】:

我有一个活跃的班级。那是运行登录页面。 我单击一个按钮以调出一个 QWidget,我已将其编码为屏幕键盘。我已经到了剩下要做的就是从 QLineEdit 中提取当前文本,然后根据键盘上按下的按钮更新该文本。键盘是一个单独的类,我的 LoginPage 中有一个函数应该从 QLineEdit 中获取文本,但是当尝试从另一个类运行该函数时,我收到一个错误: TypeError: 'bool' 对象不可调用

现在我可以假设这个错误是因为该类处于活动状态,并且为了从另一个类调用该类中的函数,必须再次调用该类,而当它已经处于活动状态时则不能。那么,当函数在活动类中时,我将如何从另一个类调用该函数。或者有没有其他解决办法。

是的,我的键盘实际上并不是当前窗口的一部分,它是单独运行的,因此它在整个程序中都是通用的

SomeCode:(删除了布局和格式等无关代码): 也忽略缩进错误

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

完全错误:

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

任何帮助将不胜感激!谢谢

注意事项: GetAttr 方法也不起作用

【问题讨论】:

    标签: python python-2.7 python-3.x pyqt pyqt4


    【解决方案1】:

    当你跑步时

    Login = self.LoginCheck()
    

    您将名称 Login 设置为调用 self.LoginCheck() 的结果,这显然返回一个布尔值。

    然后你有

    Login()
    

    由于Login 现在指的是布尔值,所以这不起作用。

    Login 使用不同的变量名。 无论如何,您不应该使用大写字母作为变量名。

    【讨论】:

    • 知道了!我不知道我怎么没看到,谢谢,而且我一直有使用大写的习惯,我认为无论如何我都不应该这样做,所以我也和我的计算机老师谈过,但他们说没有除非它干扰语言,否则没关系。
    【解决方案2】:

    您正在覆盖函数内的 Login 类。当你这样做时:

    Login = self.LoginCheck()
    

    Login 现在是一个变量,其中包含self.LoginCheck() 的结果

    我将删除分配,并在您的 if 语句中检查此方法的结果。

    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
    

    【讨论】:

    • 我重命名了 Login = LoginCheck() 变量,它修复了现在只是试图修复 GetText 函数的问题。
    【解决方案3】:

    因为 Login = self.LoginCheck() 您将 Login 设置为布尔值。您应该更改变量名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多