Нет необходимости использовать поток или дополнение другой библиотеки, вы просто должны выполнить команды, но не должны вызывать метод exec_ () QApplication, поскольку он использует интерактивную консоль python eventl oop .
$ python
Python 3.8.2 (default, Feb 26 2020, 22:21:03)
[GCC 9.2.1 20200130] on linux
Type "help", "copyright", "credits" or "license" for more information
>>> from PyQt5.QtWidgets import QApplication, QGraphicsRectItem, QGraphicsScene, QGraphicsView, QMainWindow
>>> class Rect(QGraphicsRectItem):
... def mousePressEvent(self, event):
... print("foo")
...
>>> app = QApplication([])
>>> window = QMainWindow()
>>> window.setGeometry(100, 100, 400, 400)
>>> view = QGraphicsView()
>>> scene = QGraphicsScene()
>>> rect = Rect(0, 0, 150, 150)
>>> scene.addItem(rect)
>>> view.setScene(scene)
>>> window.setCentralWidget(view)
>>> window.show()
I Python
Поскольку I Python docs указывает, %gui backend
необходимо использовать для включения GUI событие зацикливается. В случае PyQt5 / PySide2 в начале должен использоваться %gui qt5
.
$ ipython
Python 3.8.2 (default, Feb 26 2020, 22:21:03)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: %gui qt5
In [2]: from PyQt5.QtWidgets import QApplication, QGraphicsRectItem, QGraphicsScene, QGraphicsView, QMainWindow
In [3]: class Rect(QGraphicsRectItem):
...: def mousePressEvent(self, event):
...: print("foo")
...:
In [4]: app = QApplication([])
In [5]: window = QMainWindow()
In [6]: window.setGeometry(100, 100, 400, 400)
In [7]: view = QGraphicsView()
In [8]: scene = QGraphicsScene()
In [9]: rect = Rect(0, 0, 150, 150)
In [10]: scene.addItem(rect)
In [11]: view.setScene(scene)
In [12]: window.setCentralWidget(view)
In [13]: window.show()