Как отслеживать нажатия на клавиатуру в фоновом режиме и открывать по нажатию окнео 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())
