GUI mit Qt5 - Werteübergabe in Thread

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
salu44
User
Beiträge: 6
Registriert: Sonntag 22. Dezember 2019, 17:59

Hallo zusammen,

ich bin absoluter Neuling in Python und bräuchte deswegen eure Unterstützung.
Ich will eine Benutzeroberfläche in Python programmieren, um eine Dauermessung zu überwachen. Dazu will ich eingegebene Werte von der GUI einlesen und diese in den Thread übergeben. Im Thread läuft die Endlosschleife und bei einem abweichenden Wert soll dies auf der GUI kenntlich gemacht werden.

Mein Problem ist jetzt wie ich die Werte 'einst_1' und 'einst_2' aus der Main-Klasse in den Thread übergeben kann.

Vielen Dank schon mal im Voraus:)


Hier mal mein Beispiel-Code:


from PyQt5 import QtCore, QtWidgets
import time
from PyQt5.QtCore import QThread, pyqtSignal


class MyThread(QThread):
# Create a counter thread

change_text = pyqtSignal(str)

def run(self):
x = 0
while x < 1000:
x += 1
time.sleep(0.1)
if x == 50:
self.change_text.emit('FEHLER')



class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(698, 363)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.btn_start = QtWidgets.QPushButton(self.centralwidget)
self.btn_start.setGeometry(QtCore.QRect(290, 220, 151, 61))
self.btn_start.setObjectName("btn_start")
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(180, 60, 91, 31))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget)
self.comboBox_2.setGeometry(QtCore.QRect(180, 120, 91, 31))
self.comboBox_2.setObjectName("comboBox_2")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.btn_einstellungen = QtWidgets.QPushButton(self.centralwidget)
self.btn_einstellungen.setGeometry(QtCore.QRect(310, 80, 171, 41))
self.btn_einstellungen.setObjectName("btn_einstellungen")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 698, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)


self.btn_einstellungen.clicked.connect(self.Einstellungen_uebernehmen)
self.btn_start.clicked.connect(self.Messung_starten)


self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.btn_start.setText(_translate("MainWindow", "Start"))
self.comboBox.setItemText(0, _translate("MainWindow", "5"))
self.comboBox.setItemText(1, _translate("MainWindow", "10"))
self.comboBox.setItemText(2, _translate("MainWindow", "15"))
self.comboBox_2.setItemText(0, _translate("MainWindow", "20"))
self.comboBox_2.setItemText(1, _translate("MainWindow", "30"))
self.comboBox_2.setItemText(2, _translate("MainWindow", "40"))
self.btn_einstellungen.setText(_translate("MainWindow", "Einstellungen übernehmen"))



def Einstellungen_uebernehmen(self):
'''Diese Funktion liest die Einstellungswerte vom GUI ein.'''

self.einst_1 = int(self.comboBox.currentText())
self.einst_2 = int(self.comboBox_2.currentText())

print('Einstellung 1: ', self.einst_1)
print('Einstellung 2: ', self.einst_2)

self.btn_einstellungen.setStyleSheet("background-color: rgb(0,220,0)")



def Messung_starten(self):
self.thread = MyThread()
self.thread.change_text.connect(self.setText)
self.thread.start()

def setText(self, text):
self.btn_start.setText(text)



if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
salu44
User
Beiträge: 6
Registriert: Sonntag 22. Dezember 2019, 17:59

Sorry, hier nochmal der Code ordentlich dargestellt:

Code: Alles auswählen

from PyQt5 import QtCore, QtWidgets
import time
from PyQt5.QtCore import QThread, pyqtSignal


class MyThread(QThread):
    # Create a counter thread

    change_text = pyqtSignal(str)

    def run(self):
        x = 0
        while x < 1000:
            x += 1
            time.sleep(0.1)
            if x == 50:
                self.change_text.emit('FEHLER')





class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(698, 363)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btn_start = QtWidgets.QPushButton(self.centralwidget)
        self.btn_start.setGeometry(QtCore.QRect(290, 220, 151, 61))
        self.btn_start.setObjectName("btn_start")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(180, 60, 91, 31))
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox_2.setGeometry(QtCore.QRect(180, 120, 91, 31))
        self.comboBox_2.setObjectName("comboBox_2")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.btn_einstellungen = QtWidgets.QPushButton(self.centralwidget)
        self.btn_einstellungen.setGeometry(QtCore.QRect(310, 80, 171, 41))
        self.btn_einstellungen.setObjectName("btn_einstellungen")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 698, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)


        self.btn_einstellungen.clicked.connect(self.Einstellungen_uebernehmen)
        self.btn_start.clicked.connect(self.Messung_starten)


        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btn_start.setText(_translate("MainWindow", "Start"))
        self.comboBox.setItemText(0, _translate("MainWindow", "5"))
        self.comboBox.setItemText(1, _translate("MainWindow", "10"))
        self.comboBox.setItemText(2, _translate("MainWindow", "15"))
        self.comboBox_2.setItemText(0, _translate("MainWindow", "20"))
        self.comboBox_2.setItemText(1, _translate("MainWindow", "30"))
        self.comboBox_2.setItemText(2, _translate("MainWindow", "40"))
        self.btn_einstellungen.setText(_translate("MainWindow", "Einstellungen übernehmen"))



    def Einstellungen_uebernehmen(self):
        '''Diese Funktion liest die Einstellungswerte vom GUI ein.'''

        self.einst_1 = int(self.comboBox.currentText())
        self.einst_2 = int(self.comboBox_2.currentText())

        print('Einstellung 1: ', self.einst_1)
        print('Einstellung 2: ', self.einst_2)

        self.btn_einstellungen.setStyleSheet("background-color: rgb(0,220,0)")



    def Messung_starten(self):
        self.thread = MyThread()
        self.thread.change_text.connect(self.setText)
        self.thread.start()

    def setText(self, text):
        self.btn_start.setText(text)



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
Antworten