У нас есть приложение Qt5, которое использует PySide2. Недавно мы хотели показать графики с использованием matplotlib, когда наше приложение PySide2 работает в том же процессе (в другом потоке), но затем происходит сбой matplotlib (при использовании PySide2) или зависание перед рисованием (при использовании PyQt5).
Вот минимальный пример, раскомментируйте 23-ю строку, чтобы сделать matplotlib cra sh или заморозить:
from threading import Thread
from PySide2.QtWidgets import QApplication, QLabel
import matplotlib
matplotlib.use('QT5Agg')
import matplotlib.pyplot as plt
def start_qt_app():
t = Thread(target=qt_app_thread_func)
t.start()
def qt_app_thread_func():
app = QApplication()
label = QLabel("Hello World")
label.show()
app.exec_()
# Uncomment the line below to make matplotlib crash.
#start_qt_app()
plt.plot([1, 2, 3, 4])
plt.show()
input("Press enter to quit.")
print("Finished.")
Я предполагаю, что это связано с ограничением, что в процессе может быть запущено только 1 приложение QApplication. , Так что это приводит к неправильному выводу go в matplotlib.
Как я могу решить эту проблему? Мне приходит в голову одно решение - создать прокси-объект для matplotlib, который запускает matplotlib в другом процессе, но я не уверен, что это будет наименее трудоемким решением. Может быть, я могу как-то заставить matplotlib использовать существующее QApplication? Я не могу запустить наше приложение PySide2 в другом процессе, так как оно использует динамически создаваемые массивы numpy для передачи из основного потока в GUI, и запуск его в другом процессе будет стоить производительности.