PyQt可以将widget存储在局部变量中吗?

时间:2018-02-09 05:58:42

标签: python pyqt5

class App(QMainWindow):


def __init__(self):
    super().__init__()


def initUI(self):

    label = QLabel('Python', self)
    label.move(50,50)
    self.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
在initUI()函数中

标签小部件编码为label = QLabel('python',self) 但是当initUI()函数完成并退出时,标签变量将被丢弃,标签对象将被删除。

所以为什么它不像

那样编码
self.lable = QLabel('python',self)

为什么这种形式也是正确的

1 个答案:

答案 0 :(得分:3)

撰写label = QLabel('Python', self)相当于label = QLabel('Python', parent=self)。指定父级时,对label的引用将隐式存储在parent中,并且label的引用计数会递增。如果您不熟悉引用计数 - 只有当引用计数减少为0时,垃圾收集器才会删除该变量。因此,在您的示例中label实际上不会被删除(如果您已经编写了{ {1}}你的主张会持有)。

同样,当您编写label = QLabel('Python')时,您正在指示python在self.label = QLabel('python', self)中存储引用并再次递增引用计数。

在这两种情况下,通过将self的引用存储在创建label范围之外的另一个对象内,可以使label在生命周期内保持不变那个对象。

至于使用哪个,它们都是正确的,但您可以根据您的尝试选择其中一个。对于像静态标签这样的简单事物,第二种方法不会带来任何好处,并且会增加您必须执行的输入量。但是,对于在label中存储引用的更复杂的应用程序,您可以轻松地从代码中的其他位置访问该对象。