【问题标题】:Create a class object from another class in python从python中的另一个类创建一个类对象
【发布时间】:2016-02-04 13:32:36
【问题描述】:

我是 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 中选择的对象,它是在另一个类中创建的?

希望你能帮助我。

【问题讨论】:

    标签: python class object pyqt


    【解决方案1】:

    问题是您试图通过 class 对象而不是 instance 对象访问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)
            ...
    

    【讨论】:

    • 非常感谢您的回答,这对我有用。
    【解决方案2】:

    'Win' 是类对象,这个对象没有'splitter' 属性。如果我引用“Win”类的 init,它看起来像 splitter 是“Win”实例的属性而不是“Win”类的属性

    self.splitter.QSplitter(Qt.Vertical) 
    

    因此,当您尝试访问 Win.splitter 时,您确实会遇到错误。

    这应该是您设计的一部分,拆分器应该是实例属性或类属性,我不是在您的设计中建议任何东西。但只是为了工作你的代码如果你想访问 Win.splitter 然后做下面的改变:-

    def __init__(self):
       #A lot of stuff in here
    
       Win.splitter.QSplitter(Qt.Vertical)
    

    或者你可以改变 def deleteObjectCreated(self) 如下:-

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

    【讨论】:

    • 感谢您的回答。我不能做出改变,因为我会从我所做的其他方法中遇到错误。有没有其他方法可以让它发挥作用?
    • 那你能不能把Win的实例传给def deleteObjectCreated(self, instance_win),然后访问instance_win.splitter?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多