Как отслеживать нажатия на клавиатуру в фоновом режиме и открывать по нажатию окнео PyQT?

У меня есть метод, который открывает новое окно. Я попытался призвать его с помощью библиотеки keyboard через keyboard.add_hotkey(), но по каким то причинам программа вылетает.

При этом если попробовать открыть это окно не через клавиатуру, а через QPushButton то все получается.

Передо мной стоит задача открывать дочернее окно приложения нажатием сочетания клавиш , при этом не находясь в основном окне.

import sys
import keyboard
from PyQt5.QtWidgets import *


class App(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Image')
        self.setGeometry(50, 50, 640, 480)
        self.but = QPushButton(self)
        self.but.setGeometry(0,0, 300,300)
        self.but.clicked.connect(self.ran)
        self.App = App2()
        keyboard.add_hotkey("ctrl", self.ran)

    def ran(self):
        self.App.show()

class App2(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Image')
        self.setGeometry(0, 0, 100, 100)

if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = App()
        w.show()
        sys.exit(app.exec())


Ответы (1 шт):

Автор решения: S. Nick

Возможное решение заключается в использовании сигналов:

import sys
import keyboard
from PyQt5.Qt import *


class KeyBoardManager(QObject):
    keySignal = pyqtSignal(str)

    def start(self):
        keyboard.add_hotkey(
            "Ctrl + A", lambda: self.keySignal.emit("Ctrl+A"), suppress=True)
        keyboard.add_hotkey(
            "Q", lambda: self.keySignal.emit("Q"), suppress=True)
            

class App2(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Image')
        self.setGeometry(410, 580, 100, 100)
        

class App(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        
        manager = KeyBoardManager(self)
        manager.keySignal.connect(self.ran)
        manager.start()

    def initUI(self):
        self.setWindowTitle('Image')
        self.resize(400, 300)
        self.but = QPushButton(self)
        self.but.setFixedSize(100, 100)
        self.but.clicked.connect(lambda: self.ran('btn'))
        
        self.app_2 = App2()
#        keyboard.add_hotkey("ctrl", self.ran)

    def ran(self, value=None):
        if value == 'btn':
            print("Вы нажали кнопку")
        elif value == 'Q':
            print("QApplication.quit()")
            QApplication.quit()
        elif value == 'Ctrl+A': 
            print("Вы нажали 'Ctrl+A'")        
            self.app_2.show()
            
    def closeEvent(self, event):
        self.app_2.close()


if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = App()
        w.show()
        sys.exit(app.exec())

введите сюда описание изображения

→ Ссылка