Rao*_*Rao 1 python oop class pyqt4
我在一个文件中有两个类.
主类将具有更新该类中的UI元素的方法.它创建另一个类的实例.
我想在另一个被实例化的类中更新主类中的UI.
class Add(QtGui.QMainWindow,Ui_AddShotDetails):
def __init__(self):
super(Add,self).__init__()
self.setupUi(self)
def addDetails(self):
#Do some stuff and call method in Manager class
Manager.EpiChange() # I get the error at this line
class Manager(QtGui.QMainWindow,Ui_ShotManager):
def __init__(self):
super(Manager,self).__init__()
self.setupUi(self)
self.AddWindow = Add()
def EpiChange(self):
Manager.EpiCode = str(self.cmb_Epi.currentText())
# Update ui elements
def addShot(self):
self.AddWindow.show()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
win = Manager()
win.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
我得到以下Traceback
Traceback (most recent call last):
File "D:\Manager.py", line 18, in addDetails
Manager.EpiChange()
TypeError: unbound method EpiChange() must be called with Manager instance as first argument (got nothing instead)
Run Code Online (Sandbox Code Playgroud)
我尝试将此方法作为classmethod使用,@classmethod如果我使用这个我得到下面的追溯
Traceback (most recent call last):
File "D:\Manager.py", line 27, in EpiChange
Manager.EpiCode = str(self.cmb_Epi.currentText())
AttributeError: type object 'Manager' has no attribute 'cmb_Epi'
Run Code Online (Sandbox Code Playgroud)
def EpiChange(self)
Run Code Online (Sandbox Code Playgroud)
此签名意味着您的方法是实例方法,并且实际上等待实例对象作为第一个参数.
如果你的方法没有对类实例做任何事情,但是需要类本身,那么它将被称为"类方法",并且应该等待类本身作为第一个参数.
最后,如果你的方法不需要那些(并且你不需要在方法签名中使用那些自己的),但你仍然希望它放在某个类中 - 它在Python中被称为"静态方法".
看一下classmethod和staticmethod内置函数(可以使用(通常用于)作为装饰器).
关于你的代码:看起来你的Add类需要以某种方式传递给它的Manager实例,例如:
class Add(QtGui.QMainWindow,Ui_AddShotDetails):
def __init__(self, manager):
super(Add,self).__init__()
self.manager = manager
self.setupUi(self)
def addDetails(self):
#Do some stuff and call method in Manager class
self.manager.EpiChange() # I get the error at this line
Run Code Online (Sandbox Code Playgroud)
然后以这种方式创建Add实例:
self.AddWindow = Add(self)
Run Code Online (Sandbox Code Playgroud)
小智 5
您正在调用类的函数而不创建它的实例.理论上,您必须创建Manager类的实例,然后调用其方法.就像是:
manager_object = Manager()
manager_object.EpicChange()
Run Code Online (Sandbox Code Playgroud)