Назначить функцию на горячую кнопку
Проблема с QMessageBox.
Сам по себе работает без нареканий в любом месте программы.
При попытке назначить функцию на горячую кнопку:
keyboard.add_hotkey("Ctrl + 1", lambda: eval("show_warning()"))
сообщение отображается, но затем подвисает и выдается:
Process finished with exit code -1073741819 (0xC0000005)
Похоже подвисает именно на строчке msg_box.exec_().
Как это победить?
Спасибо!
Код:
from PyQt5 import QtCore, QtWidgets, QtGui
import keyboard
from PyQt5.QtWidgets import QApplication
import sys
from PyQt5.QtWidgets import QMessageBox
def show_warning():
msg_box = QMessageBox()
msg_box.setWindowIcon(QtGui.QIcon("../Test_3/image/hot.png"))
msg_box.setIcon(QMessageBox.Warning)
msg_box.setText("text")
msg_box.setStandardButtons(QMessageBox.Ok)
msg_box.setDefaultButton(QMessageBox.Ok)
msg_box.setWindowTitle("title")
msg_box.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
# keyboard.add_hotkey("Ctrl + 1", lambda: eval("show_warning()"))
keyboard.add_hotkey("Ctrl + 1", lambda: show_warning())
#keyboard.wait('Ctrl + Q')
sys.exit(app.exec())
Ответы (2 шт):
Автор решения: Александр
→ Ссылка
from PyQt5 import QtCore, QtWidgets, QtGui
import keyboard
from PyQt5.QtWidgets import QApplication
import sys
from PyQt5.QtWidgets import QMessageBox
def close_app_qt():
QApplication.quit()
def show_warning():
app = QApplication(sys.argv)
msg_box = QMessageBox()
#msg_box.setWindowIcon(QtGui.QIcon("../Test_3/image/hot.png"))
msg_box.setIcon(QMessageBox.Warning)
msg_box.setWindowTitle("Предупреждение")
msg_box.setText("Ни когда не блокируйте цикл событий Qt5!")
#msg_box.setStandardButtons(QMessageBox.Ok)
#msg_box.setDefaultButton(QMessageBox.Ok)
yes_button = msg_box.addButton('Ладно', QtWidgets.QMessageBox.YesRole)
yes_button.clicked.disconnect()
yes_button.clicked.connect(close_app_qt)
msg_box.exec()
if __name__ == "__main__":
# keyboard.add_hotkey("Ctrl + 1", lambda: eval("show_warning()"))
keyboard.add_hotkey("Ctrl + 1", lambda: show_warning())
keyboard.wait("Ctrl + 2", lambda: exit())
Автор решения: S. Nick
→ Ссылка
Обратный вызов, связанный с add_hotkey, выполняется во вторичном потоке,
а в коде обратным вызовом является метод show_msg,
который модифицирует GUI, который запрещен Qt.
Решение заключается в использовании сигналов:
import sys
import keyboard
from PyQt5.QtCore import Qt, QObject, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
class KeyBoardManager(QObject):
keySignal = pyqtSignal(str)
def start(self):
keyboard.add_hotkey(
"Ctrl + 1", lambda: self.keySignal.emit('1'), suppress=True)
keyboard.add_hotkey(
"Ctrl + Q", lambda: self.keySignal.emit('Q'), suppress=True)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__(flags=Qt.WindowStaysOnTopHint)
manager = KeyBoardManager(self)
manager.keySignal.connect(self.show_msg)
manager.start()
def show_msg(self, value):
if value == 'Q':
QApplication.quit()
elif value == '1':
msg_box = QMessageBox()
msg_box.setWindowIcon(QIcon("Ok.png"))
msg_box.setIcon(QMessageBox.Warning)
msg_box.setText("text")
msg_box.setStandardButtons(QMessageBox.Ok)
msg_box.setDefaultButton(QMessageBox.Ok)
msg_box.setWindowTitle("title")
msg_box.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False)
win = MainWindow()
# win.show()
sys.exit(app.exec_())
