2016-07-22 15 views
0

Ich verwende ein benutzerdefiniertes Widget, das von QWidget erbt. Dieses Widget kann eine Online-Ressource verwenden: ein Bild, das ich aus dem Internet herunterladen und in einer lokalen Datei speichern kann, bevor es in einer QLabel Instanz angezeigt wird.PyQt QWidget Destruktor Fehler `AttributError: 'NoneType' Objekt hat kein Attribut 'Pfad'`

Wenn der Benutzer schließt das Fenster ich die lokale Datei gelöscht werden mag, so änderte ich den destructor:

def __del__(self): 
    if os.path.isfile(self.pictureFilename): 
     os.remove(self.pictureFilename) 

ich habe:

import os 

am Anfang meines Skripts. Seltsamerweise, wenn die Hauptanwendung schließt erhalte ich die Fehlermeldung:

Traceback (most recent call last):

File "/home/XXX/XXX/XXX.py", line 103, in del

AttributeError: 'NoneType' object has no attribute 'path'

Es sieht aus wie die Bibliothek Müll vor dem Destruktor aufgerufen wird, gesammelt wird. Ich sehe nicht, wie ich das beheben kann.

+0

Und Zeile 103 ist der 'os.path.isfile()' Anruf oben? – Suever

+0

@Suever: genau –

+0

Können Sie uns ein wenig mehr Code geben, den wir ausführen können, um das Verhalten zu reproduzieren? – Suever

Antwort

2

Betrachtet man den GitHub-Code, scheint das Problem zu sein, dass, wenn das Widget geschlossen ist, die Qt-Anwendung beendet und sys.exit() aufgerufen wird, so dass wahrscheinlich das Modul vor __del__ Aufruf Müll gesammelt wird.

dort:

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    url = "http://www.transfermarkt.co.uk/cristiano-ronaldo/profil/spieler/8198" 
    ex = PlayerWindow(url) 
    sys.exit(app.exec_()) 

Um das Problem zu vermeiden, schlage ich vor, die closeEvent(event) Form QWidget http://doc.qt.io/qt-5/qwidget.html#closeEvent

mit dieser

ersetzen Ihr __del__ Funktion zu verwenden:

def closeEvent(self, event): 
    if os.path.isfile(self.pictureFilename): 
     os.remove(self.pictureFilename) 
    del self.profile 
    del self.pictureLabel 

Als allgemeine Regel sollten Sie Versuchen Sie zu vermeiden, __del__ zu verwenden, um automatisch Objekt mit Müllsammlung ohne 01 abzuschließenbeginnen explizit in Ihrem Code aufgerufen.

+0

Vielen Dank für die Eingabe, in der Tat behebt es das Problem. Ich werde daran denken, 'closeEvent' das nächste Mal zu verwenden;) –

+0

Und sogar * mit *' del object' - alles 'del' bedeutet, eine Referenz zu löschen (wie' object = None'), es gibt noch keine Garantie wann (und wenn überhaupt, wird "__del__" aufgerufen. –