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)
为什么这种形式也是正确的
答案 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
中存储引用的更复杂的应用程序,您可以轻松地从代码中的其他位置访问该对象。