【问题标题】:Why do I need to keep a variable pointing to my QWidget?为什么我需要保留一个指向我的 QWidget 的变量?
【发布时间】:2016-08-15 20:39:24
【问题描述】:

为什么下面的例子只有在创建了无用的_ 变量时才有效?

_ 变量已分配且从未使用过。我会假设一个好的编译器会优化而不是创建它,而是会有所作为。

如果我删除_ = 并只留下Test(),则创建窗口,但它会闪烁并立即消失,python 永远挂起。

代码如下:

import sys
from PyQt4 import QtGui

class Test(QtGui.QWidget):
    def __init__(self):
        super().__init__()
        self.show()

app = QtGui.QApplication(sys.argv)
_ = Test()
sys.exit(app.exec_())

【问题讨论】:

  • 你的意思是Test()而不是Example()
  • 如果一个 Python 对象没有被引用,它就会被垃圾回收,这就解释了为什么窗口闪烁然后消失了。
  • 那么一个你的程序没有它就无法工作的变量是“无用的”吗?
  • I would assume a good compiler would optimize and not even create it - python 没有被编译并且没有编译器。它会完全按照你说的去做。此外,函数调用和对象创建可能会产生任意副作用,例如 class Evil(object): def __init__(self): import os; os.rmdir('/')
  • 回复:“假设一个好的编译器会优化,甚至不会创建它”——任何模块范围的赋值都有副作用,因为它......嗯......创建一个变量在模块中。可以通过尚不存在的代码(可能是模块外部的代码)动态搜索该变量。

标签: python pyqt4


【解决方案1】:

这是一个非常好的问题,由于我的 PyQt 小部件和插件这一事实,我过去遇到过很多奇怪的问题,基本上这要归功于 python garbage collector

当您在进入 Qt 的主循环之前将您的实例分配给该 _ 虚拟变量时,将会有一个活动引用避免被垃圾收集器收集,因此该小部件不会被销毁。

【讨论】:

  • 这是否意味着如果我想在非全局对象的方法中创建窗口,那么一旦对象超出范围,窗口就会被销毁?如果我想(我不知道出于什么原因)我需要将它分配给一个全局变量?
  • 是的,就是这个意思。
【解决方案2】:

@BPL 是正确的,但我想补充一点,您不必将其分配给 _。您可以将其分配给您喜欢的任何变量。您只需要一个引用您创建的对象的变量,否则它会在创建后被垃圾收集器收集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多