PyQt:管理两个主窗口

PyQt:管理两个主窗口,pyqt,qmainwindow,Pyqt,Qmainwindow,我正试图用PyQt为我的RFID访问控制项目管理两个主窗口(MainWindow和AccessWindow)。 我想一直显示第一个主窗口(无限循环)。 然后,当RFID阅读器(正在“自动读取模式”下工作)读取RFID标签时,我想隐藏它并显示第二个主窗口。 因此,在主python程序中,我有一个伪“do while”循环(while True:and break with a condition),用于在串行端口上读取读取器提供的数据。然后我检查一个数据库。。这不重要。因此,触发事件是“当读卡器读

我正试图用PyQt为我的RFID访问控制项目管理两个主窗口(MainWindow和AccessWindow)。 我想一直显示第一个主窗口(无限循环)。 然后,当RFID阅读器(正在“自动读取模式”下工作)读取RFID标签时,我想隐藏它并显示第二个主窗口。 因此,在主python程序中,我有一个伪“do while”循环(while True:and break with a condition),用于在串行端口上读取读取器提供的数据。然后我检查一个数据库。。这不重要。因此,触发事件是“当读卡器读取某些内容时”。 我从另一个论坛得到了一些帮助,现在我有了:

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys, pyodbc, serial
import os
import time

#Variables
Code_Zone = "d"

class MainWindow(QtGui.QWidget):
    def __init__(self, main):
        super(MainWindow, self).__init__()
        self.main = main
        self.grid = QtGui.QGridLayout(self)
        self.welcome = QtGui.QLabel("WELCOME", self)
        self.grid.addWidget(self.welcome, 2, 2, 1, 5)

class AccessWindow(QtGui.QWidget):
    def __init__(self):
        super(AccessWindow, self).__init__()
        self.setMinimumSize(150, 50)
        self.grid = QtGui.QGridLayout(self)
        self.label = QtGui.QLabel(self)
        self.grid.addWidget(self.label, 1, 1, 1, 1)

class Main(object):
    def __init__(self):
        self.accueil = MainWindow(self)
        self.accueil.show()
        self.access = AccessWindow()

    def wait(self):
        # RFID READER ENDLESS LOOP
        while 1:

            global EPC_Code
            ser = serial.Serial(port='COM6', baudrate=115200)    
            a = ser.read(19).encode('hex')
            if (len(a)==38):
                EPC_Code = a[14:] 
                print ('EPC is : ' + EPC_Code)
                break
            else:
                continue
        ser.close()


        self.on_event(EPC_Code)

    def on_event(self, data):
        def refresh():
            self.toggle_widget(False)
            self.wait()
        # vérification des données 
        EPC_Code = data
        sql_command = "[Get_Access_RFID] @Code_RFID = '"+EPC_Code+"', @Code_Zone = '"+Code_Zone+"'"  #  STORED PROCEDURE
        db_cursor.execute(sql_command)
        rows = db_cursor.fetchone()
        result= str(rows[0])
        print ("result = " + str(result))
        if result == "True":
            # si OK
            self.access.label.setText('ACCESS GRANTED')
        else:
            # si pas OK
            self.access.label.setText('ACCESS DENIED')
        self.toggle_widget(True)
        QtCore.QTimer.singleShot(2000, refresh)

    def toggle_widget(self, b):
        self.accueil.setVisible(not b)
        self.access.setVisible(b)

if __name__=='__main__':
    cnxn = """DRIVER={SQL Server};SERVER=***;PORT=***;UID=***;PWD=***;DATABASE=***"""
    db_connection = pyodbc.connect(cnxn)
    db_cursor = db_connection.cursor()
    print ('Connected TO DB & READY')
    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.wait()
    sys.exit(app.exec_())

现在我的问题是,当我运行程序时,第一个窗口的文本不会出现,但当我将我的徽章放在RFID阅读器附近时,第二个窗口的文本会出现。

创建一个主窗口,而不是两个主窗口。
QtGui.QWidget
称为
MainView
AccessView
。只需将正确的视图放入窗口,而无需更换窗口。这样,您就可以在不打开/关闭窗口的情况下交换视图

如果使用布局,则窗口将调整大小以适应视图

下一个问题是阻止UI线程,这意味着Qt无法处理事件(如“绘制UI”事件)。要解决此问题,必须在后台线程中移动RFID处理代码。您可以从此后台线程发出信号以更新UI

注意:不能从线程调用UI代码!!只需发出信号。PyQt的主循环将看到并处理这些信号

相关的:

  • ,尤其是使用信号的第二个示例。第一个示例已中断(不允许从线程调用
    addItem()

你好,Aaron,你能告诉我如何在后台线程中移动RFID处理事件吗..我是PyQt的初学者,不知道如何操作..我检查了两个链接,但我什么都不懂..我从3天以来就被卡住了..我真的需要你的帮助!这个网站不是为你编写代码,而是你在自己编写代码之前提出问题:-)请重新阅读文章,当你不懂单词或概念时开始提问。诚恳地说,我不懂你的说明。我可以向你展示我的更新代码,然后你纠正我吗?。我检查了文章,尝试了一些方法,但在新问题中这样做(单击本页顶部的“提问”)。