2016-02-04 120 views
1

我是新的python,我试图在一个类中创建一个对象,然后从另一个类中删除同一个对象。从python的另一个类创建一个类对象

这是代码的一部分:

class Win(QMainWindow): 
list_1 = []    #This lists are filled with objects 
list_2 = [] 
def __init__(self): 
    #A lot of stuff in here 

    self.splitter = QSplitter(Qt.Vertical) 

def addObject(self): 
    plot = Matplotlib()  #This is another class where i create a matplotlib figure 
    if len(Win.list_1) < 2: 
    self.splitter.addWidget(plot) 

所以,用这一点,我创建一个对象,如果在LIST_1项的数目是低于3,并且然后我将它添加到LIST_1和list_2,和当然,我将它添加到分离器中。这工作正常。现在,我创造这样删除这个分路器(与它里面太的对象)的方法:

deleteObject(self): 
    if len(Win.list_1) == 1: 
     widget_erased = self.splitter.widget(index) 
     widget_erased.hide() 
     widget_erased.deleteLater() 

正如你所看到的,如果我有1个对象,我可以将其删除。问题出现时,我有更多的对象。在这个同样的方法我写:

if len(Win.list_1) > 1: 
    #I open A QDialog where i see the names of the objects from the lists in a QListWidget 
     self.delete = Delete()  
     self.delete.exec_() 

现在,这是与QDialog的类:

class Delete(self): 
    def _init__(self): 
    #A lot of stuff in here 

    def deleteObjectCreated(self): 
    #There are another things before the next lines 

    widget_erased = Win.splitter.widget(index) 
    widget_erased.hide() 
    widget_erased.deleteLater() 

利用这最后的方法,我选择在QDialog的对象,当我按下一个按钮,对象从两份名单中删除,但仍然分路器,我得到这个错误:

type object "Win" has no attribute "splitter"

我怎样才能做到这一点?我的意思是,删除我从QDialog中选择的对象,这是在另一个类中创建的?

希望你能帮助我。

回答

1

的问题是您尝试通过对象访问splitter对象,而不是实例对象。

在你的榜样,这可以通过设置实例对象(即self)作为Delete对话框的父来解决:

class Win(QMainWindow): 
    ... 

    def deleteObject(self): 
     ... 
     if len(self.list_1) > 1: 
      self.delete = Delete(self) # set self as the parent 


class Delete(self): 
    def _init__(self, parent): 
     super(Delete, self).__init__(parent) 
     ... 

    def deleteObjectCreated(self): 
     widget_erased = self.parent().splitter.widget(index) 
     ... 
+0

非常感谢你的回答,这对我有用。 –

0

'Win'是类对象,并且此对象没有'splitter'属性。如果我是指阶级“赢”的初始化它看起来像分路器是“赢”不是阶级的属性“赢”

self.splitter.QSplitter(Qt.Vertical) 

所以你理所当然地得到错误的实例的属性,当您尝试访问赢。分离器。

这应该是你的设计的一部分,分离器应该是实例属性或类属性,我没有建议你的设计上有任何东西。但为了工作,你的代码,如果你想访问Win.splitter然后做如下修改: -

def __init__(self): 
    #A lot of stuff in here 

    Win.splitter.QSplitter(Qt.Vertical) 

或者您可以如下更改高清deleteObjectCreated(个体经营): -

def deleteObjectCreated(self, instance_win): 
    instance_win.splitter.QSplitter(Qt.Vertical) 
+0

谢谢您的回答。我无法做出这样的改变,因为我会从其他方法中发现错误。有没有另一种方法来使它工作? –

+0

然后你可以通过Win的实例来def deleteObjectCreated(self,instance_win),然后访问instance_win.splitter? – AlokThakur

相关问题