如何将Pyqt与双窗口RFID读卡器应用程序和信号槽机制结合使用?

2024-10-02 22:31:47 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在为RFID阅读器构建GUI。我以前用过tkinter,但我有表演方面的问题。总之有两个屏幕:主屏幕和访问屏幕。主屏幕在屏幕上,只有读卡器上有卡时,访问屏幕才打开。读卡时会出现图片和标签。你知道吗

1)据我所知,我应该使用信号槽机制,因为我必须将数据从RFID线程传递到GUI线程。对吗?你知道吗

2)我可以不用按钮使用信号槽吗?我在网上找到的所有例子都是用按钮来显示信号槽机制。所以我很困惑。你知道吗

当读卡器读卡时,如何显示第二个小部件或带有卡所有者姓名的窗口。你知道吗

代码如下:

import sys
import datetime
import time
from time import strftime 
from babel.dates import format_date, format_datetime, format_time
from PyQt5.QtWidgets import QApplication, QWidget, QFrame, QLabel, QHBoxLayout, QVBoxLayout, QMainWindow
from PyQt5.QtGui import QIcon, QPixmap, QFont
from PyQt5 import QtCore, Qt
from PyQt5.QtCore import pyqtSignal


class App(QWidget):

    def __init__(self):
        super().__init__()
        self.left = 0
        self.top = 0
        self._width = 480
        self._height = 800
        self.Idle()
        #self.Access()


    def Idle(self):
        self.setGeometry(self.left, self.top, self._width, self._height)
        self.background =QLabel(self)
        pixmap = QPixmap('main_page')
        self.background.setPixmap(pixmap)
        self.background.resize(pixmap.width(), pixmap.height())

        layout = QVBoxLayout()
        self.setLayout(layout)
        layout.setSpacing(0) 
        layout.addSpacing(20) 


        #Logo
        logo = QLabel(self)
        logo.setPixmap(QPixmap('logo'))
        layout.addWidget(logo, alignment=QtCore.Qt.AlignHCenter)
        layout.addSpacing(50)

         #Date
        today = format_date(datetime.datetime.now(),"dd MMMM", locale = 'en').upper()
        day = format_date(datetime.datetime.now(), "EEEE", locale = 'en').upper()
        date = QLabel(self)
        date.setText(day + " " + today)
        date.setFont(QFont("Lato", 24))
        date.setStyleSheet('color:white')

        date.setFixedHeight(100)

        layout.addWidget(date, alignment=QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)

          #Clock
        clock = QLabel(self)
        clock.setText(strftime('%H:%M'))
        clock.setFont(QFont("Lato", 90))
        clock.setStyleSheet('color:white')
        layout.addWidget(clock, alignment=QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)


        layout.addStretch(1000)

        self.show()

class Access(QWidget)

    def Access(self):
        Name = QLabel(self)
        Name.setText("Can enter")
        #There should be UID Information which will come from Reader.
        Name.setFont(QFont("Lato", 90))
        Name.setStyleSheet('color:white')
        Name.move(240,400)

        self.show()

if __name__ == '__main__':   

    app = QApplication(sys.argv)
    ex = App()
    app.exec_()

    time.sleep(5)

和读者类:

from datetime import datetime,timedelta
import sys
from pirc522 import RFID



class Reader():
    def __init__(self):

        try:
            self.reader = RFID()
            self.prev_time = ""
            self.prev_uid = ""
        except Exception as e:
            pass
            #ErrorLogger("1", "Error in reader".format(e)).log()


    def read(self):
        cardUID = ""

        self.reader.wait_for_tag()
        (error,data) = self.reader.request()
        (error, uid) = self.reader.anticoll()
        if not error:
            for number in uid[:4]:
                cardUID += format(number,"02X")

            if ( (cardUID != self.prev_uid) or ((cardUID == self.prev_uid) and (datetime.now()-self.prev_time>timedelta(seconds=3)))):
                self.prev_time = datetime.now()
                self.prev_uid = cardUID
                return cardUID

Tags: fromimportselfformatuiddatetimedate屏幕