2016-02-04 168 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

相關問題