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()
并且在QThread
的run()
方法中放置所有操作,如果你从主线程调用线程方法[=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)
我正在使用 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()
并且在QThread
的run()
方法中放置所有操作,如果你从主线程调用线程方法[=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)