Использование основного терминала: невозможно, поскольку он заблокирован QApplication (app.exec _ ())
Вы можете опустить app.exec()
, если находитесь в пределах Python терминал и он не будет блокировать. Как объяснено здесь , это работает, потому что ...
PyQt5 устанавливает ловушку ввода (используя PyOS_InputHook), которая обрабатывает события, когда интерактивный интерпретатор ожидает ввода данных пользователем. Это означает, что вы можете, например, создавать виджеты из командной строки Python, взаимодействовать с ними и по-прежнему иметь возможность вводить другие команды Python.
Например, введите следующее в оболочке Python иметь одновременно работающий виджет Qt и неблокирующий REPL.
$> python
Python 3.7.6 | packaged by conda-forge | (default, Jan 7 2020, 22:05:27)
[Clang 9.0.1 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from PyQt5.QtWidgets import QApplication, QWidget
>>> a = QApplication([])
>>> w = QWidget()
>>> w.show()
>>> w.raise_()
I Python имеет аналогичную функциональность. Если вы начнете с ipython --gui=qt
или наберете %gui qt
в терминале, вы получите тот же эффект ...
$> ipython
Python 3.7.6 | packaged by conda-forge | (default, Jan 7 2020, 22:05:27)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.11.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: %gui qt
In [2]: from PyQt5 import QtWidgets
In [3]: win = QtWidgets.QPushButton("click me")
In [4]: win.show()
In [5]: win.raise_()
Я рекомендую использовать I Python, потому что он лучше подходит для интерактивной работы и он будет работать с PySide (возможно, обычный Python и PySide также будет работать; я не проверял).
См. Также мой предыдущий ответ здесь
Наконец, хотя это работает, я не знаю, насколько хороша производительность. Это хорошее решение для хобби-проекта, но если у вас много пользователей, я бы подумал о внедрении терминала в приложении или какой-либо форме межпроцессного взаимодействия.