PyQt5:使用插槽/信号时,self 是 NoneType

Posted

技术标签:

【中文标题】PyQt5:使用插槽/信号时,self 是 NoneType【英文标题】:PyQt5: self is NoneType when using slot/signals 【发布时间】:2014-01-27 23:23:39 【问题描述】:

我在尝试在自定义类上使用插槽/信号时遇到了一些问题。

类如下所示:

import sys
from PyQt5 import QtCore
from PyQt5.QtGui import QGuiApplication, QPixmap

class Screenshot(QtCore.QObject):
    newScreenshotTaken = QtCore.pyqtSignal(QPixmap)
    timer = QtCore.QTimer()
    captureInterval = 5 * 60

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

    def startCapture(self):
        self.capture()

    def stopCapture(self):
        self.timer.stop()

    def on_userStartedCapture(self):
        self.startCapture()

    def on_userStoppedCapture(self):
        self.stopCapture()

    def capture(self):
        print("capture!")

错误发生在 on_userStartedCapture(self):

  File "/Volumes/HD2/test/screenshot.py", line 23, in on_userStartedCapture
    self.startCapture()
AttributeError: 'NoneType' object has no attribute 'startCapture'

Emit 是从另一个类调用的:

self.userStartedCapture.emit()

连接在 main.py 完成:

screenshot = Screenshot()
mainWindow = MainWindow()

mainWindow.userStartedCapture.connect(screenshot.on_userStartedCapture)

奇怪的是 self 可以在我的应用程序中的所有插槽/信号上工作。但是我不知道为什么这个特定的失败了。

对可能发生的事情有什么想法吗?

【问题讨论】:

引发错误是因为在发送信号时selfNone。也就是说,信号连接的Screenshot的实例已经被删除(或正在被删除)。显然很难比这更精确,因为您已经省略了代码的相关部分。 @ekhumoro 这很有意义。屏幕截图实例化是在扩展 QtWidgets.QWidget 的类 AppWindow 的 init 中完成的。在应用程序的整个执行过程中保持它可用的正确方法是什么? @ekhumoro 谢谢!我只是将屏幕截图实例更改为类属性,而不是 init 中的局部变量,并且它起作用了。您能否将您的评论添加为答案,以便我接受? 完成。很高兴听到你把它修好了:) 【参考方案1】:

引发错误是因为在发送信号时selfNone。也就是说,信号连接的Screenshot的实例已经被删除(或正在被删除)。

【讨论】:

以上是关于PyQt5:使用插槽/信号时,self 是 NoneType的主要内容,如果未能解决你的问题,请参考以下文章

PYQT5 信号和插槽 [重复]

PyQt5 线程、信号和插槽。连接错误

PYQT5 - 插槽函数不采用默认参数 [重复]

PyQt 信号和插槽:“新风格”发射?

当信号没有找到它的插槽时

PyQt5 - 无法在子类中捕获 mousePressEvent