2014-01-27 37 views
1

我在嘗試在自定義類上使用插槽/信號時遇到了一些問題。PyQt5:當使用插槽/信號時,self是無類型

類看起來是這樣的:

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' 

的Emit從另一個類叫做:

self.userStartedCapture.emit() 

和Connect在main.py完成:

screenshot = Screenshot() 
mainWindow = MainWindow() 

mainWindow.userStartedCapture.connect(screenshot.on_userStartedCapture) 

奇怪的是,自我適用於我的應用程序中的所有插槽/信號。但我無法找出爲什麼這個具體的失敗。

關於可能發生什麼的任何想法?

+0

由於在發送信號時'self'爲'None',所以引發錯誤。也就是說,信號所連接的「Screenshot」實例已被刪除(或正在被刪除)。很明顯,要比這更精確,因爲你省略了代碼的相關部分。 – ekhumoro

+0

@ekhumoro這是有道理的。截圖實例化是在類AppWindow的__init__中完成的,該類擴展了QtWidgets.QWidget。在整個應用程序執行過程中保持可用的正確方法是什麼? – Fernando

+0

@ekhumoro謝謝!我只是將屏幕截圖實例更改爲類屬性,而不是__init__中的局部變量,並且工作正常。您能否將您的評論添加爲答案,以便我可以接受它? – Fernando

回答

1

由於在發送信號時selfNone,所以引發錯誤。也就是說,信號所連接的Screenshot實例已被刪除(或正在被刪除)。