Сообщение указывает, что проблема в том, что обратный вызов вызывается из другого потока, и в Qt графический интерфейс не может быть обновлен из другого потока, возможное решение состоит в создании класса, который предоставляет сигнал, который подключается к шоу, и чтоСигнал выдается как обратный вызов.
import sys
import keyboard
from PySide import QtCore, QtGui
class SignalHelper(QtCore.QObject):
signal = QtCore.Signal()
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Example')
def main():
app = QtGui.QApplication(sys.argv)
window = Example()
helper = SignalHelper()
helper.signal.connect(window.show)
keyboard.add_hotkey('ctrl+alt+9', helper.signal.emit)
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Или для этих случаев лучше использовать QMetaObject::invokeMethod()
с Qt::QueuedConnection
, поскольку show()
- это слот, как показано ниже:
import sys
import keyboard
from PySide import QtCore, QtGui
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Example')
def main():
app = QtGui.QApplication(sys.argv)
window = Example()
keyboard.add_hotkey('ctrl+alt+9',
QtCore.QMetaObject.invokeMethod,
args=(window, "show", QtCore.Qt.QueuedConnection))
sys.exit(app.exec_())
if __name__ == '__main__':
main()