Python:从活动的 class 调用函数
Python: Calling function from an active class
我有一个活跃的class。那是 运行 登录页面。
我单击一个按钮调出一个 QWidget,我已将其编码为屏幕键盘。我已经到了剩下要做的就是从 QLineEdit 中提取当前文本,然后根据键盘上按下的按钮更新该文本。键盘是一个单独的 class,我的 LoginPage 中有一个函数应该从 QLineEdit 中获取文本,但是当尝试 运行 来自另一个 class 的函数时,我得到一个错误:
类型错误:'bool' 对象不可调用
现在我可以假设此错误是因为 class 处于活动状态,并且为了从另一个 class 调用此 class 中的函数,class 必须再次调用,当它已经处于活动状态时不能调用。那么当函数处于活动状态 class 时,我将如何从另一个 class 调用该函数。或者有其他解决办法吗
是的,我的键盘实际上不是当前 window 的一部分,它 运行 是分开的,所以它在整个程序中通用
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 方法也不起作用
因为 Login = self.LoginCheck()
您将 Login
设置为布尔值。您应该更改变量名称。
当你运行
Login = self.LoginCheck()
您正在将名称 Login
设置为调用 self.LoginCheck()
的结果,这显然 returns 是一个布尔值。
然后你有
Login()
因为 Login
现在指的是布尔值,所以这行不通。
为 Login
使用不同的变量名称。
无论如何你都不应该使用大写字母作为变量名。
您正在函数中覆盖 Login
class。当你这样做时:
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
我有一个活跃的class。那是 运行 登录页面。 我单击一个按钮调出一个 QWidget,我已将其编码为屏幕键盘。我已经到了剩下要做的就是从 QLineEdit 中提取当前文本,然后根据键盘上按下的按钮更新该文本。键盘是一个单独的 class,我的 LoginPage 中有一个函数应该从 QLineEdit 中获取文本,但是当尝试 运行 来自另一个 class 的函数时,我得到一个错误: 类型错误:'bool' 对象不可调用
现在我可以假设此错误是因为 class 处于活动状态,并且为了从另一个 class 调用此 class 中的函数,class 必须再次调用,当它已经处于活动状态时不能调用。那么当函数处于活动状态 class 时,我将如何从另一个 class 调用该函数。或者有其他解决办法吗
是的,我的键盘实际上不是当前 window 的一部分,它 运行 是分开的,所以它在整个程序中通用
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 方法也不起作用
因为 Login = self.LoginCheck()
您将 Login
设置为布尔值。您应该更改变量名称。
当你运行
Login = self.LoginCheck()
您正在将名称 Login
设置为调用 self.LoginCheck()
的结果,这显然 returns 是一个布尔值。
然后你有
Login()
因为 Login
现在指的是布尔值,所以这行不通。
为 Login
使用不同的变量名称。
无论如何你都不应该使用大写字母作为变量名。
您正在函数中覆盖 Login
class。当你这样做时:
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