PyQt5 Python на Raspberry Pi с резьбовым RFID - PullRequest
0 голосов
/ 16 октября 2018

У меня есть приложение Raspberry Pi 3 b + Time Punch, которое я пытаюсь использовать с RFID-считывателем Mifare RC522.

У меня RFID-считыватель в отдельном потоке, который при активации запускает окно Time Punch.Поток RFID запускает сигнал, который считывается A def в окне перфорации.Это определение выводит данные из сигнала RFID, но не заполняет текстовое поле.Смотрите код ниже.Я очень увлекаюсь программированием и не могу понять это

import SimpleMFRC522
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import QtCore
import time
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication, QLabel
import RPi.GPIO as GPIO
import threading
from threading import Timer
#Turn Off GPIO Warnings
GPIO.setmode(GPIO.BCM) # Specifies referring to GPIO pins by Broadcom SOC channel
GPIO.setwarnings(False) #Disables the Warning

###################################################################################################
#RFID Thread Class
class ThreadRFID(QThread):
    signal = pyqtSignal(str, str, int)

    def __init__(self):
        QThread.__init__(self)
        self.PunchDialog = PunchWindow()

    def __del__(self):
        self.wait()

    def run(self):

        #Initialize RFID Reader
        reader = SimpleMFRC522.SimpleMFRC522()
        try:
            id, text = reader.read()
            print(id)
            print("Text from RFID scan = " + text)

            if(id == 955738786217):  #Validate card is company ID 
                print(" scan card success")

                self.PunchDialog.show() # Launches Punch Window  

                #Send sgnal to onPunch Class in PunchWindow
                otherClass = PunchWindow()
                self.signal.connect(otherClass.onPunch)
                self.signal.emit("Data From RFID ", text, 10) 


        finally:
            GPIO.cleanup()

        time.sleep(1)        
        self.myThread = ThreadRFID()
        self.myThread.start()
########################################################################################################    

class PunchWindow(QMainWindow):    
    def __init__(self):
        super(PunchWindow, self).__init__()  
        self.move(550,200)
        self.resize(480,320)
        self.title = 'Punch Window'
        self.left = 900
        self.top = 106
        self.lbl = QLabel('Punch Times', self)
        self.txtDataField = QLineEdit(self)
        self.txtDataField.move(10, 100)
        self.txtDataField.resize(321,41)
        self.txtDataField.setText("")
        self.lbl.setText("Company ")

        #btnUpdate -- test button to validate function of update
        self.btnUpdate = QPushButton("Update", self)
        self.btnUpdate.move(230, 140)
        self.btnUpdate.clicked.connect(self.Update)
        self.btnUpdate.resize(141,91)

    @pyqtSlot(str, str, int)   
    def onPunch(self, strA, strB, int1):
        print(strA, strB, int1)
        self.txtDataField.setText(strA)
##        self.Update() 
##          
    def Update(self):
        print("In def Update")
        self.txtDataField.setText("Works to Update with btnUpdate")


#Main Window
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.title = ' '
        self.left = 420
        self.top = 106
        self.width = 800
        self.height = 600
        self.setMinimumSize(800,600)
        self.setMaximumSize(800,600)
        self.setWindowFlags( QtCore.Qt.CustomizeWindowHint ) #Turns off Min/Max/Close buttons

        self.lbl = QLabel('Company Spash Screen', self)
        self.lbl.move(10, 100)
        self.lbl.resize(321,41)

        self.initUI()

        pass1 = 1
        self.myThread = ThreadRFID()
        self.myThread.start()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)


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

1 Ответ

0 голосов
/ 16 октября 2018

В Qt GUI не может быть обновлен из другого потока, который порождает эту проблему.Если вы хотите, чтобы было окно, когда что-то происходит в потоке, вы должны сделать это с помощью сигналов, как я покажу ниже, с другой стороны, запрос id и текст должны выполняться внутри цикла.

import SimpleMFRC522
from PyQt5 import QtCore, QtGui, QtWidgets 
import RPi.GPIO as GPIO


GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)


class ThreadRFID(QtCore.QThread):
    signal = QtCore.pyqtSignal(str, str, int)
    successSignal = QtCore.pyqtSignal()

    def __del__(self):
        self.wait()

    def run(self):
        #Initialize RFID Reader
        reader = SimpleMFRC522.SimpleMFRC522()
        while True:
            _id, text = reader.read()
            if _id == 955738786217:  #Validate card is company ID 
                print(" scan card success")
                self.successSignal.emit()
                self.signal.emit("Data From RFID ", text, 10) 


class PunchWindow(QtWidgets.QMainWindow):    
    def __init__(self):
        super(PunchWindow, self).__init__()  
        self.move(550,200)
        self.resize(480,320)
        self.title = 'Punch Window'
        self.left = 900
        self.top = 106
        self.lbl = QtWidgets.QLabel('Punch Times', self)
        self.txtDataField = QtWidgets.QLineEdit(self)
        self.txtDataField.setGeometry(10, 100, 321,41)
        self.lbl.setText("Company ")

        #btnUpdate -- test button to validate function of update
        self.btnUpdate = QtWidgets.QPushButton("Update", self)
        self.btnUpdate.move(230, 140)
        self.btnUpdate.clicked.connect(self.Update)
        self.btnUpdate.resize(141,91)

    @QtCore.pyqtSlot(str, str, int)   
    def onPunch(self, strA, strB, int1):
        self.txtDataField.setText(strA) 

    def Update(self):
        print("In def Update")
        self.txtDataField.setText("Works to Update with btnUpdate")


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.title = ' '
        self.left = 420
        self.top = 106
        self.width = 800
        self.height = 600
        self.setFixedSize(800,600)
        self.setWindowFlags( QtCore.Qt.CustomizeWindowHint ) #Turns off Min/Max/Close buttons

        self.lbl = QtWidgets.QLabel('Company Spash Screen', self)
        self.lbl.setGeometry(10, 100, 321,41)

        self.initUI()

        self.PunchDialog = PunchWindow()

        self.myThread = ThreadRFID(self)
        self.myThread.start()
        self.myThread.successSignal.connect(self.PunchDialog.show)
        self.myThread.signal.connect(self.PunchDialog.onPunch)

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

    def closeEvent(self, event):
        GPIO.cleanup() 
        super(MainWindow, self).closeEvent(event)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MW = MainWindow()
    MW.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...