2016-10-28 1 views
2

Ich schrieb eine Anwendung mit Pyside (QtPy). Die Anwendung ermöglicht dem Benutzer: 1. Einen Pfad scannen - Die Anwendung scannt einen Standardpfad und zeigt die vorhandenen Ordner in diesem Pfad als eine Liste von Kontrollkästchen an. 2. Der Benutzer kann mehrere Ordner auswählen und dann einen Prozess (Schaltfläche) für alle diese Ordner ausführen.Wie sende ich eine Liste von der Hauptbenutzeroberfläche zu Qthread in Pyside, QtPy Python?

Im Hintergrund: Wenn der Benutzer auf 'Prozess' klickt, scanne ich die Checkbox-Liste und erstelle eine neue Liste nur für den ausgewählten Ordner (die 'markierten' Checkboxen oder 'Benutzer ausgewählten Ordner').

Der eigentliche Prozess zu diesen Ordnern wird in einer Schleife in einer QThread-Klasse ausgeführt.

Die Herausforderung ist - Wie kann mein QThread die "ausgewählte Ordner-Liste" von der Haupt-UI-Methode verwenden ???? An dieser Stelle war die einzige Möglichkeit, es zum Laufen zu bringen, diese Liste zu einem globalen Parameter zu machen. Die Hauptbenutzeroberflächenmethoden setzen Werte auf die globale Liste, QThread kann diese globale Liste lesen.

Ich habe alle möglichen Dokumentation über Signale und Steckplätze gelesen, und ich habe kein Problem, etwas von der Qthread an die Hauptbenutzeroberfläche zu senden, aber ich konnte keine vernünftige Erklärung für das Senden von Daten an einen Thread finden.

Vielen Dank.

+1

sollten Sie ein le sein [diese] zu verlängern (http://stackoverflow.com/a/ 35534047/1994235) antworte damit, dass Daten mit dem Signal vom Hauptthread zum qthread enthalten sind (es funktioniert genauso wie die umgekehrte Richtung, von der du gesagt hast, dass du weißt, wie es geht) –

+0

Hey, Danke für deine Antwort, Also um sicherzustellen, dass ich verstehe, basierend auf diesem: "... setzen Sie Ihren Code in eine Unterklasse von QObject und verschieben Sie dieses Objekt auf eine Standard-QThread-Instanz ..." Ich muss meinen aktuellen Code ändern, der "run" verwendet Methode zu einem QObject, das ich später verschieben werde Einfädeln. –

+0

Ok. Ich habe meinen gesamten QThread "Run" -Methodeninhalt in myWorker auf eine neue run-Methode übertragen und mit dem "starte" -Signal des Threads verbunden und es funktioniert wie ein Zauber. Aber als ich bemerkte, kann ich die gleiche Liste mit meiner aktuellen Implementierung zuweisen. Ziemlich peinlich, wie einfach es ist ... Ich könnte einfach etwas tun wie: self.myQThread.list = self.myUIlist und jetzt meine die Lauf-Methode im Thread sieht diese Liste. –

Antwort

0

Eigentlich endete ich mit einer sehr einfachen Lösung. Ich habe meine Liste in einer neuen Liste im Thread-Objekt festgelegt.

self.runningProcess = clMyThread() #This is my thread object 
self.runningProcess.ThreadList = self.MainList 

self.MainList wird, was Liste, die Sie in der Benutzeroberfläche als Eingang bekamen, während die ThreadList die gleiche Liste im Thread selbst ist.

Also, wenn Sie, was etwas zu dieser Liste im Fadenlauf-Funktion zu tun, können Sie:

for item in self.ThreadList: 
    do_something() 
+0

Hey, danke, ich habe eine ähnliche Vorgehensweise gewählt, aber es scheint, dass mein Computer sich sehr schnell aufheizt, weil ich eine Schleife im Hintergrund-Thread laufen lasse. ohne den Prozessor verrückt zu machen? – Aboogie

+0

Welche Art von Prozess laufen Sie dort? –

Verwandte Themen