пытается использовать клавиатуру 4x4 с приложением PyQt5 GUI - PullRequest
2 голосов
/ 02 ноября 2019

Я пытаюсь написать код, который принимает данные с клавиатуры 4x4 (механической), используя модуль pad4pi с приложением GUI на основе pyqt5.

, когда я пытаюсь нажать кнопку, она работает правильно, но когда я пытаюсь сгенерировать какое-то событиея получаю сообщение об ошибке:

QObject::startTimer: Timers can only be used with threads started with QThread
class DigitalClock(QWidget,QThread):
    def __init__(self):
        super().__init__()
        SetupKeyboard.keypad.registerKeyPressHandler(self.printKey)
        self.setWindowTitle("OM SAI RAM")
        self.showFullScreen() 
        #self.setCursor(Qt.BlankCursor)
        button = QPushButton("Click", self) 
        button.clicked.connect(self.change)
        button.move(10,10)    
        button.show()

    def change(self):
        self.newpage = Authentication_page()
        self.close()

    def printKey(self, key):
        if key == 'A':
            self.newpage = Authentication_page()
            self.close()

class Authentication_page(QWidget):
    """
    Class to validate authentication.
    """
    def __init__(self):
        super().__init__()
        self.showFullScreen() 
        self.maindesign()

    def maindesign(self):
        """Method to design main page"""
        ####Label###
        self.admin_header = QLabel("Admin Panel", self)
        self.admin_header.setStyleSheet("font-size:40px")
        self.admin_header.move(130, 10)
        self.admin_header.show() 

, когда я нажимаю кнопку, код работает нормально, но когда я нажимаю механическую кнопку, код останавливается с сообщением об ошибке.

1 Ответ

2 голосов
/ 02 ноября 2019

Обработчик, назначенный registerKeyPressHandler, выполняется в потоке, где отслеживаются ключи, в вашем случае printKey выполняется во вторичном потоке, где вы пытаетесь создать виджет, но это запрещено Qt.

Решение состоит в том, чтобы создать объект QObject и подать сигнал (поскольку сигналы являются поточно-ориентированными), отправив нажатую клавишу, а затем подключиться к слоту, где вы получаете информацию:

from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject
from PyQt5.QtWidgets import QLabel, QPushButton, QWidget

from pad4pi import rpi_gpio


class KeypadManager(QObject):
    keyPressed = pyqtSignal(object)

    def __init__(self, parent=None):
        super().__init__(parent)
        factory = rpi_gpio.KeypadFactory()
        self._keypad = factory.create_4_by_4_keypad()
        self._keypad.registerKeyPressHandler(self._key_press_handler)

    def _key_press_handler(self, key):
        self.keyPressed.emit(key)


class DigitalClock(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("OM SAI RAM")
        self._keypad_manager = KeypadManager()
        self._keypad_manager.keyPressed.connect(self.printKey)

        # self.setCursor(Qt.BlankCursor)
        button = QPushButton("Click", self)
        button.clicked.connect(self.show_authentication_page)
        button.move(10, 10)

        self.showFullScreen()

    def show_authentication_page(self):
        self.newpage = Authentication_page()
        self.close()

    @pyqtSlot(object)
    def printKey(self, key):
        if key == "A":
            self.show_authentication_page()


class Authentication_page(QWidget):
    # ...
...