ich benötige mal wieder eure Hilfe, bitte.
Folgendes möchte ich erreichen, der Benutzer klickt auf einen "Loggin"-Button, dann soll ein Fenster aufgehen, in dem steht dass der Benutzer seinen RFID-Chip an den Reader halten soll und dabei wird ein Countdown runter gezählt.
Das Lesen des RFID-Readers oder das Fenster muss in ein Thread ausgelagert werden. Ich weis nicht was davon sinnvoller ist, denn wenn der Chip ausgelesen ist, soll das Fenster geschlossen werden und wenn innerhalb des angegebenen Zeitraum kein Chip ausgelesen wird, dann soll das Fenster auch geschlossen werden.
Das Fenster mit dem Countdown und anschließendem schließen, blockierend im Haupt-Thread habe ich:
Code: Alles auswählen
import sys
from PySide6.QtCore import QThread, QTimer
from PySide6.QtWidgets import QApplication, QMessageBox, QWidget
from ui_form import Ui_FitForFactory
LOGIN_TEXT = "Zur Anmeldung Chip vorhalten\nVerbleibende Zeit:"
class LoginMessage(QMessageBox):
def __init__(self, timeout=10):
super(LoginMessage, self).__init__(parent=None)
self.timer = QTimer()
self.timeout = timeout
self.timer.timeout.connect(self.tick)
self.timer.setInterval(1000)
self.setText(f"{LOGIN_TEXT} {self.timeout} s")
self.setWindowTitle("Login")
self.setDefaultButton(self.addButton(QMessageBox.Cancel))
def showEvent(self, event):
self.tick()
self.timer.start()
def tick(self):
self.timeout -= 1
if self.timeout > 0:
self.setText(f"{LOGIN_TEXT} {self.timeout} s")
else:
self.timer.stop()
self.defaultButton().animateClick()
@staticmethod
def create_new(timeout):
window = LoginMessage(timeout)
window.setIcon(QMessageBox.Information)
return window.exec_()
class Example(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_FitForFactory()
self.ui.setupUi(self)
self.ui.login_button.clicked.connect(self.login_process)
def login_process(self):
self.show_login()
print("XX")
@staticmethod
def show_login():
LoginMessage.create_new(timeout=10)
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = Example()
widget.show()
sys.exit(app.exec())
Meine Idee war, ich lasse das Anzeigen des Fensters in einem extra Thread laufen. Wenn ich `threading.Thread()` verwende, bekomme ich die Meldung, das ich `QThread` verwenden soll. Da finde ich aber gar keinen Einstieg. Es gibt zwar viele Beispiele mit `Worker(QObject)`-Klassen, nur bekomme ich das nicht umgesetzt, also so gar nicht, das ich auch kein Versuch zeigen kann.
Daher erst mal meine Fragen:
Welchen Teil würdet ihr auslagern?
Kann ich `QThread` nicht ähnlich wie `threading.Thread(target=self.show_login).start()` verwenden?
Dann muss ich vermutlich noch eine `Queue` mit ins Spiel bringen um zu kommunizieren und gegebenenfalls den Thread vorzeitig zubeenden. Das wäre aber mein zweiter Part.
Könnt ihr mir bitte ein paar Denkanstöße geben?
Vielen Dank und Grüße
Dennis