【问题标题】:PyQt - Window().show() fails but var = Window(); var.show() works?PyQt - Window().show() 失败但 var = Window(); var.show() 有效吗?
【发布时间】:2013-01-10 13:49:08
【问题描述】:

当我发现一些我根本不理解的东西时,这是我正在搞乱的一些示例代码。

这段代码似乎可以工作

from PyQt4 import QtGui, QtCore
import sys

class Window(QtGui.QWidget):
    def __init__(self):
        pass

ap = QtGui.QApplication(sys.argv)
var = Window()
var.show()
sys.exit(ap.exec_())

但这会导致窗口出现而不是快速连续消失。 (第二条底线改变了)

from PyQt4 import QtGui, QtCore
import sys

class Window(QtGui.QWidget):
    def __init__(self):
        pass

ap = QtGui.QApplication(sys.argv)
Window().show()
sys.exit(ap.exec_())

我根本不明白为什么。在我对 python 和 Qt 的所有理解中,我无法理解为什么底部会失败。是垃圾回收还是什么?

谢谢!

【问题讨论】:

  • 这两个示例都应该对缩进错误大喊大叫,因为__init__ 正文中没有任何内容。
  • 已更正。我的测试代码有一堆其他垃圾注释掉了,后缀是 pass。为了清楚起见,我在提出问题时将其全部删除,并忘记在通过语句中添加回

标签: python constructor pyqt variable-assignment


【解决方案1】:

在第二个版本中,您不保留对 Window 实例的引用,因此 Python 将在执行该行代码后销毁它。在第一个版本中,您通过代码块在var 中保留引用。最重要的是,当您调用ap.exec_() 时,var 就存在。

【讨论】:

  • 您能否详细说明实际发生的情况? “免费”是什么意思。那我为什么会看到呢?
  • 查看编辑后的答案。当你调用show()时你会看到它,它在之后被销毁。
【解决方案2】:

它有效,但不是在__init__() 中写pass,而是这样写:

super(Window, self).__init__()

您的 __init__() 函数为空。

这里是完整的代码:

from PyQt4 import QtGui
import sys

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()

ap = QtGui.QApplication(sys.argv)
var = Window()
var.show()
sys.exit(ap.exec_())

我用 PySide 测试过,应该也可以在 PyQt 上工作。

【讨论】:

  • 我没有超类构造函数,因为它不影响结果。您的“完整代码”之所以有效,是因为它有一个专用变量var,而不是因为构造函数。
猜你喜欢
  • 2011-06-07
  • 2014-02-28
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多