简体   繁体   English

主文件PyQt4中的外部功能

[英]External functions in main file PyQt4

I tried really hard to make this code to work. 我非常努力地使此代码起作用。 I tried with Qtimer, proccesEvents and I didn't have the results I wanted. 我尝试使用Qtimer,proccesEvents,但没有想要的结果。 The GUI starts, so something works, but there are no changes, so the method reading() doesn't work. GUI启动,因此可以正常工作,但是没有任何更改,因此read()方法不起作用。

I searched a lot on stackoverflow to find some help, but I couldn't find. 我在stackoverflow上进行了大量搜索以寻求帮助,但找不到。 Perhaps I am not capable. 也许我没有能力。

This is the code: 这是代码:

import RPi.GPIO as GPIO
import MFRC522
import signal
import time
from PyQt4 import QtCore, QtGui
from ui_mainwindow import Ui_MainWindow

class MainWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.ui = Ui_MainWindow()

        self.ui.setupUi(self)

    def reading(self):
        self.ui.processEvents()
        ### Event Functions ###
        continue_reading = True

        # Hook the SIGINT
        signal.signal(signal.SIGINT, end_read)

        # Create an object of the class MFRC522
        MIFAREReader = MFRC522.MFRC522()

        # This loop keeps checking for chips. If one is near it will get the UID and authenticate
        while continue_reading:
            # Scan for cards    
            (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)

            # Get the UID of the card
            (status,uid) = MIFAREReader.MFRC522_Anticoll()

            # If we have the UID, continue
            if status == MIFAREReader.MI_OK:

                # This is the default key for authentication
                key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]

                # Select the scanned tag
                MIFAREReader.MFRC522_SelectTag(uid)

                # Authenticate
                status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)

                # Check if authenticated
                if status == MIFAREReader.MI_OK:

                    MIFAREReader.MFRC522_Read(8)

                    self.ui.label_3.show()
                    self.ui.label_2.show()
                    self.ui.label_4.show()
                    self.ui.groupBox.setStyleSheet(_fromUtf8("background: white;\n"
                    "border-style: solid;\n"
                    "border-width: 1px;\n"
                    "border-radius: 20px;"))

                    time.sleep(5)
                    MIFAREReader.MFRC522_StopCrypto1()
                    self.ui.label_3.hide()
                    self.ui.label_2.hide()
                    self.ui.label_4.hide()
                    self.ui.groupBox.setStyleSheet(_fromUtf8("background: white url(scan.png) no-repeat center;\n"
                    "border-style: solid;\n"
                    "border-width: 1px;\n"
                    "border-radius: 20px;"))
                else:
                    self.ui.groupBox.setStyleSheet(_fromUtf8("background: white url(accsd.png) no-repeat center;\n"
                    "border-style: solid;\n"
                    "border-width: 1px;\n"
                    "border-radius: 20px;"))
                    time.sleep(3)
                    self.ui.groupBox.setStyleSheet(_fromUtf8("background: white url(scan.png) no-repeat center;\n"
                    "border-style: solid;\n"
                    "border-width: 1px;\n"
                    "border-radius: 20px;"))

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

You never call the function reading() ? 您从未调用过函数reading()吗? So why should it go in there? 那么为什么要去那里呢?

I'm not sure what you want to achieve, but you could try: 我不确定您要实现什么,但是您可以尝试:

def __init__(self, parent=None):
    QtGui.QWidget.__init__(self, parent)

    self.ui = Ui_MainWindow()

    self.ui.setupUi(self)

    self.reading() ####################

But that will only call the function once. 但这只会调用一次函数。 When do you want reading() to execute? 您何时要执行reading()

The task of reading data is blocking so it should not run on the thread of the GUI but on another thread, on the other hand you should not change the GUI from another thread but communicate the change through signals as I show below: 读取数据的任务正在阻塞,因此它不应在GUI线程上运行,而应在另一个线程上运行,另一方面,您不应从另一个线程更改GUI,而应通过信号传达更改,如下所示:

import MFRC522
# import signal
import time

from PyQt4 import QtCore, QtGui
from ui_mainwindow import Ui_MainWindow
import threading

class MainWindow(QtGui.QMainWindow):
    state1, state2, state3, state4 = range(4)
    stateChanged = QtCore.pyqtSignal(int)

    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.stateChanged.connect(self.onChangeState)
        threading.Thread(target=self.reading, daemon=True).start()

    def onChangeState(self, state):
        if state == MainWindow.state1:
            self.ui.label_3.show()
            self.ui.label_2.show()
            self.ui.label_4.show()
            self.ui.groupBox.setStyleSheet(_fromUtf8("background: white;\n"
                    "border-style: solid;\n"
                    "border-width: 1px;\n"
                    "border-radius: 20px;"))
        elif state == MainWindow.state2:
            self.ui.label_3.hide()
            self.ui.label_2.hide()
            self.ui.label_4.hide()
            self.ui.groupBox.setStyleSheet(_fromUtf8("background: white url(scan.png) no-repeat center;\n"
                    "border-style: solid;\n"
                    "border-width: 1px;\n"
                    "border-radius: 20px;"))

        elif state == MainWindow.state3:
            self.ui.groupBox.setStyleSheet(_fromUtf8("background: white url(accsd.png) no-repeat center;\n"
                    "border-style: solid;\n"
                    "border-width: 1px;\n"
                    "border-radius: 20px;"))

        elif state == MainWindow.state4:
            self.ui.groupBox.setStyleSheet(_fromUtf8("background: white url(scan.png) no-repeat center;\n"
                    "border-style: solid;\n"
                    "border-width: 1px;\n"
                    "border-radius: 20px;"))


    def reading(self):
        ### Event Functions ###
        continue_reading = True
        # Hook the SIGINT
        #signal.signal(signal.SIGINT, end_read)
        # Create an object of the class MFRC522
        MIFAREReader = MFRC522.MFRC522()
        # This loop keeps checking for chips. If one is near it will get the UID and authenticate
        while continue_reading:
            # Scan for cards    
            (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
            # Get the UID of the card
            (status,uid) = MIFAREReader.MFRC522_Anticoll()

            # If we have the UID, continue
            if status == MIFAREReader.MI_OK:
                # This is the default key for authentication
                key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
                # Select the scanned tag
                MIFAREReader.MFRC522_SelectTag(uid)
                # Authenticate
                status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)
                # Check if authenticated
                if status == MIFAREReader.MI_OK:

                    MIFAREReader.MFRC522_Read(8)
                    self.stateChanged.emit(MainWindow.state1)
                    time.sleep(5)
                    MIFAREReader.MFRC522_StopCrypto1()
                    self.stateChanged.emit(MainWindow.state2)

                else:
                    self.stateChanged.emit(MainWindow.state3)
                    time.sleep(3)
                    self.stateChanged.emit(MainWindow.state4)


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM