PyQt5: self имеет значение NoneType при использовании слота/сигналов

У меня возникают проблемы при попытке использовать слот/сигналы в пользовательском классе.

Класс выглядит так:

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 работает со всеми слотами/сигналами в моем приложении. Но я не могу понять, почему именно этот терпит неудачу.

Любые идеи о том, что может происходить?


person Fernando    schedule 27.01.2014    source источник
comment
Ошибка возникает, потому что self равно None во время отправки сигнала. То есть экземпляр Screenshot, к которому подключен сигнал, был удален (или находится в процессе удаления). Очевидно, что трудно быть более точным, поскольку вы пропустили соответствующие части своего кода.   -  person ekhumoro    schedule 28.01.2014
comment
@ekhumoro это имеет смысл. Создание скриншота было выполнено в init класса AppWindow, который расширяет QtWidgets.QWidget. Каков правильный способ сохранить его доступным в течение всего выполнения приложения?   -  person Fernando    schedule 28.01.2014
comment
@ekhumoro Спасибо! Я просто изменил экземпляр снимка экрана на свойство класса вместо локальной переменной в init, и это сработало. Не могли бы вы добавить свой комментарий в качестве ответа, чтобы я мог его принять?   -  person Fernando    schedule 28.01.2014
comment
Сделанный. Рад слышать, что вы исправили :)   -  person ekhumoro    schedule 28.01.2014


Ответы (1)


Ошибка возникает, потому что self равно None во время отправки сигнала. То есть экземпляр Screenshot, к которому подключен сигнал, был удален (или находится в процессе удаления).

person ekhumoro    schedule 28.01.2014