Einfachste Weg für PyQT Threading
Ich habe ein GUI mit PyQt eine Funktion addImage(image_path)
. Einfach vorstellen, es wird aufgerufen, wenn ein neues Bild Hinzugefügt werden soll, in ein QListWidget. Für die Erkennung neuer Bilder in einem Ordner, ich benutze ein threading.Thread
mit watchdog
zu erkennen changes-Datei in den Ordner, und dieser thread ruft dann addImage
direkt.
Daraus ergibt sich die Warnung, dass QPixmap
sollte nicht aufgerufen werden, die außerhalb des gui-Threads aus Gründen der thread-Sicherheit.
Was ist die beste und einfachste Weg, um diese threadsicher? QThread? Signal /Slot? QMetaObject.invokeMethod? Ich brauche nur übergeben Sie eine Zeichenfolge aus dem thread zu addImage
.
InformationsquelleAutor user3696412 | 2016-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, der beste Ansatz ist, mit dem signal/slot-Mechanismus. Hier ist ein Beispiel. (Anmerkung: siehe die BEARBEITEN unten, die Punkte, die eine mögliche Schwäche in meinem Ansatz).
In Ihrem GUI-Anwendung code, sollten Sie das erstellen des neuen Thread, gib ihm die richtige callback-Funktion, und es läuft.
BEARBEITEN
Herr three_pineapples und Mr. Brendan Abel wies darauf hin, eine Schwäche in meinem Ansatz. Ja, der Ansatz funktioniert gut für diesen speziellen Fall, denn Sie erzeugen /emittieren das signal direkt. Wenn Sie sich mit built-in-Qt-Signale auf Schaltflächen und widgets, sollten Sie einen anderen Ansatz (wie in der Antwort von Mr. Brendan Abel).
Herr three_pineapples empfahl mir ein neues Thema zu erstellen, in StackOverflow, um einen Vergleich zwischen den verschiedenen Ansätzen der thread-sicheren Kommunikation mit einer GUI. Ich werde mich Graben, sich in die Materie und machen das morgen 🙂
Du bist herzlich willkommen. Ich bin froh, dass es dir geholfen 🙂
Ich lief in dieses problem, gerade heute. Ich auch, ich auch zugegriffen mein GUI in einem thread-unsichere Weise. Mein Absturz, Elend, ohne richtige Fehlermeldungen: stackoverflow.com/questions/37242849/... Dann habe ich der signal/slot-Mechanismus, wie ich beschrieben in meiner Antwort. Es hat mir geholfen. Ich bin glücklich, es hilft dir auch 🙂
Wer downvoted diese Antwort, ohne einen Kommentar hinterlässt? 🙁 Bitte einfach einen Kommentar hinterlassen, um zu erklären, warum diese Antwort ist nicht gut, vor den downvote.
Ich bin ein vernünftiger Mensch. Wer meint, dass meine Antwort nicht gut ist, kann nur Sag mir, warum, und ich werde mein bestes tun, um die richtigen änderungen. Aber nur downvoting ohne jede Erklärung hilft niemandem. Bitte..
InformationsquelleAutor K.Mulier
Sollten Sie mit dem eingebauten
QThread
zur Verfügung gestellt von Qt. Sie können Ihre Datei-monitoring code in einer Arbeiter Klasse, die erbt vonQObject
so dass Sie können mit dem Qt Signal/Slot-system zum übergeben von Nachrichten zwischen threads.QThread
stattthreading.Thread
? Scheint fast der gleiche code.Der Unterschied ist, dass dies der übliche Weg, um die Verwendung von threads in Qt/PyQt-mein Beispiel ist im Grunde das gleiche wie die Worker Model beschrieben in der offiziellen Dokumentation. Es ist auch im Allgemeinen davon abgeraten, Signale aussenden, die auf andere Objekte, die von außerhalb diejenigen Objekte, die die andere Antwort nicht und die die offizielle Arbeiter-Modell nicht.
Hi Brendan @Brendan Abel, Können Sie klar: "Es ist auch im Allgemeinen davon abgeraten, Signale aussenden, die auf andere Objekte, die von außerhalb diejenigen Objekte, die die andere Antwort nicht und die die offizielle Arbeiter-Modell nicht"? Ich bin daran interessiert zu wissen, mehr über diese. Da ich mit den signal / slot-Mechanismus eine Menge in meiner letzten Anwendung. Ich danke Ihnen sehr 🙂
Intern, Qt-Signale umgesetzt werden, als geschützte member-Funktionen. So, während das, was Sie getan haben, kann die Arbeit in diesem Beispiel (weil das signal wurde in python), es funktioniert nicht, als eine Allgemeine Lösung (ie. es wird nicht generell die Arbeit mit dem builtin-Qt-Signale auf Schaltflächen und widgets).
Was ist eine "geschützte member-Funktion"?
InformationsquelleAutor Brendan Abel