Window PyQt5 中的切换和线程

Window switching and threading in PyQt5

我正在使用 PyQT 开发 GUI。我的目标是制作一个程序,从 RFID 卡读取 id 并在读取后切换 windows。

我目前的问题是,当我运行程序时,第一个window(锁定屏幕)根本不会显示,但读卡后第二个window(菜单)出现。我找不到解决这个问题的方法。我的第一次尝试根本没有线程,但我认为线程会帮助解决这个问题,但我最终遇到了同样的情况。读卡工作等等,但我认为问题出在 Qt 上,因为我没有太多的 Qt 经验。

class ThreadRFID(QtCore.QThread):

   signal = QtCore.pyqtSignal(str, str, int)
   successSignal = QtCore.pyqtSignal()

   def __del__(self):
      self.wait()

   def read(self):
       #Initialize RFID Reader
       reader = SimpleMFRC522()
       while True:
           #here reading the card and processing data...
           id, text = reader.read()
           self.successSignal.emit()

class UILock(object):
   def __init__(self):
       super(UILock, self).__init__()

   def setupUI(self, MainWindow):
       MainWindow.setGeometry(50, 50, 400, 450)
       MainWindow.setFixedSize(400, 450)
       MainWindow.setWindowTitle("UILockTab")

 class UIMenu(object):
   def __init__(self):
       super(UIMenu, self).__init__()

   def setupUI(self, MainWindow):
       MainWindow.setGeometry(50, 50, 400, 450)
       MainWindow.setFixedSize(400, 450)
       MainWindow.setWindowTitle("UIWindow")

 class MainWindow(QMainWindow):
   def __init__(self, parent=None):
       super(MainWindow, self).__init__(parent)
       self.UILock = UILock()
       self.UIMenu = UIMenu()
       self.startLockTab()

   def startLockTab(self):
       self.UILock.setupUI(self)
       self.show()
       self.myThread = ThreadRFID(self)
       self.myThread.read()
       self.myThread.successSignal.connect(self.UIMenu.setupUI)

   def startUIWindow(self):
       self.UIMenu.setupUI(self)
       self.show()

 if __name__ == '__main__':
     import sys
     app = QtWidgets.QApplication(sys.argv)
     MW = MainWindow()
     MW.show()
     sys.exit(app.exec_())

您没有正确使用线程。如果你继承QThread,你应该只从主线程调用start()并且在QThreadrun()方法中放置所有操作,如果你从主线程调用线程方法[=15] =] 它们在主线程中执行(myThread.read() 在主线程中运行并阻塞事件循环直到 read() 的 return)。

class ThreadRFID(QtCore.QThread):
   ...
    def run(self):
        reader = SimpleMFRC522()
        while True:
            id, text = reader.read()
            self.successSignal.emit()

class UIMenu(object):
    ...
    def startLockTab(self):
        self.UILock.setupUI(self)
        self.show()
        self.myThread = ThreadRFID(self)
        self.myThread.start()
        self.myThread.successSignal.connect(self.UIMenu.setupUI)