Назначить функцию на горячую кнопку

Проблема с 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_())

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

→ Ссылка