2017-02-13 1 views
1

Ich habe den folgenden Code, aber es beschwert sich, dass ich nicht auf die UI-Daten von meinem Thread zugreifen kann. In meinem Beispielcode unten Was ist der beste Weg, auf den Wert userInputString zuzugreifen, damit mein Threading ausgeführt werden kann?PyQt: Wie UI Daten von einem QThread erhalten

self.nameField ist ein PyQt QLineEdit.

QObject :: setParent: Kann nicht eingestellt Eltern, neue Eltern in einem anderen Thread ist
QPixmap: Es ist nicht sicher pixmaps außerhalb der GUI-Thread
QWidget :: Repaint verwenden: rekursive repaint erkannt

import myUI 

class MainUIClass(QtGui.QMainWindow, myUI.Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(MainUIClass, self).__init__(parent) 
     self.setupUi(self) 

     self.startbutton.clicked.connect(self.do_work) 

     self.workerThread = WorkerThread() 
     self.connect(self.workerThread, SIGNAL("myThreading()"), self.myThreading, Qt.DirectConnection) 

    def do_work(self): 
     self.userInputString = self.nameField.Text() 
     self.workerThread.start() 

    def myThreading(self): 

     if userInputString is not None: 
      #Do something 

class WorkerThread(QThread): 
    def __init__(self, parent=None): 
     super(WorkerThread, self).__init__(parent) 

    def run(self): 
     self.emit(SIGNAL("myThreading()")) 

if __name__ == '__main__': 
    a = QtGui.QApplication(sys.argv) 
    app = MainUIClass() 
    app.show() 
    a.exec_() 
+1

Sie sollten lesen "Wie QThread richtig verwendet wird" http://StackOverflow.com/Questions/16879971/Beispiel-von-der-rechtsweg-zu-use-qthread-in-pyqt http: // blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-2/ Sie verwenden auch alten Stil Signal ... Für Sie Problem, sollten Sie verwenden Signale und Slot ... Sie führen Ihren Prozess in einem Thread, dann von diesem Thread senden Sie ein Signal an den GUI-Thread, der auf die GUI-Elemente zugreifen kann – PyNico

+0

Vielen Dank für das hinweisend. Alles, was ich versuche, ist den Zugriff auf den Wert "userInputString" innerhalb meiner Thread-Klasse, aber ich weiß nicht, wie dieser Wert von der MainUI-Klasse an die Thread-Klasse übergeben wird. Glauben Sie, dass ein gemeinsamer Multithreading-Array- oder Value-Datentyp eine andere Möglichkeit wäre? – joke4me

+0

@ joke4me. Der Code in Ihrer Frage erzeugt diese Fehlermeldungen nicht. Mit kleinen Korrekturen funktioniert es genau wie erwartet. Bitte lesen Sie die Anleitung zur Bereitstellung eines [mcve]. – ekhumoro

Antwort

1

Nicht sicher, ob es ist, was Sie brauchen, aber hier ist ein Arbeits QThread exemple mit QT5

import time 
import sys 
from PyQt5 import QtWidgets, QtGui, QtCore 

class MainWindow(QtWidgets.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.worker_thread = WorkerThread() 
     self.worker_thread.job_done.connect(self.on_job_done) 
     self.create_ui() 

    def create_ui(self): 
     self.button = QtWidgets.QPushButton('Test', self) 
     self.button.clicked.connect(self.start_thread) 
     layout = QtWidgets.QVBoxLayout(self) 
     layout.addWidget(self.button) 

    def start_thread(self): 
     self.worker_thread.gui_text = self.button.text() 
     self.worker_thread.start() 

    def on_job_done(self, generated_str): 
     print("Generated string : ", generated_str) 
     self.button.setText(generated_str) 


class WorkerThread(QtCore.QThread): 

    job_done = QtCore.pyqtSignal('QString') 

    def __init__(self, parent=None): 
     super(WorkerThread, self).__init__(parent) 
     self.gui_text = None 

    def do_work(self): 

     for i in range(0, 1000): 
      print(self.gui_text) 
      self.job_done.emit(self.gui_text + str(i)) 
      time.sleep(0.5) 

    def run(self): 
     self.do_work() 


if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    test = MainWindow() 
    test.show() 
    app.exec_() 
+0

Danke, wie Sie sagten, das Code-Snippet funktioniert gut. Der Grund für den Absturz war, dass ich einen Alarm aus dem Thread drinnen machte, wenn der try/except-Block. Thread scheint kein UI-Material innerhalb des Threads zu mögen. Wenn ich stattdessen auf die Konsole drucke, funktioniert alles einwandfrei. Daher muss ich herausfinden, wie ich diese Informationen an die UI-Klasse zurückgeben kann, damit sie dem Benutzer angezeigt wird – joke4me

Verwandte Themen