Изменить окно PyQt по запросу информации из API

Есть приложение на PyQt стандартный пример.

class Login(QtWidgets.QWidget, Ui_Form):

    switch_window = QtCore.pyqtSignal()

    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.setupUi(self)

        self.pushButton.clicked.connect(self.pushbutton_handler)

    def pushbutton_handler(self):
        self.switch_window.emit()


class MainWindow(QtWidgets.QWidget, Ui_Form1):

    switch_window = QtCore.pyqtSignal()

    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.setupUi(self)

        self.pushButton.clicked.connect(self.pushbutton_handler)

    def pushbutton_handler(self):
        self.switch_window.emit()


class Controller:

    def __init__(self):
        pass

    def show_login(self):
        self.login = Login()
        self.login.switch_window.connect(self.show_main)
        self.login.show()

    def show_main(self):
        self.window = MainWindow()
        self.window.switch_window.connect(self.show_login)
        self.login.close()
        self.window.show()


def main(dr):
    app = QtWidgets.QApplication(sys.argv)
    controller = Controller()
    controller.show_login()
    controller.show_login()
    sys.exit(app.exec_())

Есть апи, которое слушает порт и возвращает 1 или 0, как заставить PyQt изменить окно если апи вернуло 1 или 0.

Помогите пожалуйста


Ответы (1 шт):

Автор решения: S. Nick

Просто запустите мой пример и понаблюдайте секунд 10, посмотрите что происходит.

import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class WorkThread(QThread):
    threadSignal = pyqtSignal(int)     

    def __init__(self, startParm):
        super().__init__()
        self.startParm = startParm 

    def run(self):
        while True:
        
            # тут вы слушает порт и возвращает 1 или 0
            
            self.msleep(2000) 
            date = random.randrange(0, 2)
            self.threadSignal.emit(date)
            
            print(f'date = {date}')            


class Login(QtWidgets.QWidget):                 # ???, Ui_Form):
    switch_window = QtCore.pyqtSignal()

    def __init__(self):
        QtWidgets.QWidget.__init__(self)
# ???        self.setupUi(self)

        self.setWindowTitle('Login')
        self.resize(300, 300)

        self.pushButton = QPushButton('Go show_main')
        self.pushButton.clicked.connect(self.pushbutton_handler)

        layout = QVBoxLayout(self)
        layout.addWidget(self.pushButton)        
        

    def pushbutton_handler(self):
        self.switch_window.emit()


class MainWindow(QtWidgets.QWidget):             # ???, Ui_Form1):
    switch_window = QtCore.pyqtSignal()

    def __init__(self):
        QtWidgets.QWidget.__init__(self)
# ???        self.setupUi(self)

        self.setWindowTitle('MainWindow')
        self.resize(400, 200)
        
        self.pushButton = QPushButton('Go show_login')
        self.pushButton.clicked.connect(self.pushbutton_handler)
        
        layout = QVBoxLayout(self)
        layout.addWidget(self.pushButton)  

    def pushbutton_handler(self):
        self.switch_window.emit()


class Controller:
    def __init__(self):
        pass
        
        self.login = Login()                                          # +++
        self.login.switch_window.connect(self.show_main)              # +++

        self.window = MainWindow()                                    # +++
        self.window.switch_window.connect(self.show_login)            # +++        

        startParm = 0
        self.thread = WorkThread(startParm)     
        self.thread.threadSignal.connect(self.on_threadSignal)
        self.thread.start()         

    def on_threadSignal(self, date):  
        if date == 0:
            self.show_login()
        elif date == 1:
            self.show_main()
    

    def show_login(self):
#        self.login = Login()
#        self.login.switch_window.connect(self.show_main)
        self.login.show()
        self.window.hide()                                            # +++

    def show_main(self):
#        self.window = MainWindow()
#        self.window.switch_window.connect(self.show_login)
#        self.login.close()
        self.window.show()
        self.login.hide()                                             # +++
        

def main(dr):
    app = QtWidgets.QApplication(sys.argv)
    controller = Controller()
    controller.show_login()
# ???    controller.show_login()
    sys.exit(app.exec_())
    
if __name__ == '__main__':
    main('dr')

введите сюда описание изображения

→ Ссылка