2014-01-27 1 views
1

У меня возникли проблемы при попытке использовать слот/сигналы в пользовательском классе.PyQt5: self is 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 (Я):

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

Испустите вызывается из другого класса:

self.userStartedCapture.emit() 

И Соединим осуществляется по адресу main.py:

screenshot = Screenshot() 
mainWindow = MainWindow() 

mainWindow.userStartedCapture.connect(screenshot.on_userStartedCapture) 

Странная вещь, что сам работает на всех слотах/сигналах в моем приложении. Но я не могу понять, почему этот конкретный провал.

Любые идеи о том, что может произойти?

+0

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

+0

@ekhumoro это имеет смысл. Создание экземпляра экрана было сделано в __init__ класса AppWindow, который расширяет QtWidgets.QWidget. Каков надлежащий способ сохранить его в течение всего выполнения приложения? – Fernando

+0

@ekhumoro Спасибо! Я просто изменил экземпляр скриншота на свойство класса вместо локальной переменной в __init__, и он сработал. Не могли бы вы добавить свой комментарий в качестве ответа, чтобы я мог его принять? – Fernando

ответ

1

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

Смежные вопросы