【发布时间】:2020-01-08 10:36:33
【问题描述】:
我们有一个使用 PySide2 的 Qt5 应用程序。最近,我们想在 PySide2 应用程序在同一进程中(在不同的线程中)运行时使用 matplotlib 显示绘图,但随后 matplotlib 崩溃(使用 PySide2 时)或在绘图前冻结(使用 PyQt5 时)。
这是一个最小示例,取消注释第 23 行以使 matplotlib 崩溃或冻结:
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 的限制有关。所以这会导致 matplotlib 出现问题。
我该如何解决这个问题?我想到的一个解决方案是为 matplotlib 创建一个代理对象,该对象在另一个进程中运行 matplotlib,但我不确定这是否是劳动强度最低的解决方案。也许我可以让 matplotlib 使用现有的 QApplication?我无法在另一个进程中运行我们的 PySide2 应用程序,因为它使用动态创建的 numpy 数组从主线程传递到 GUI,并且在另一个进程中启动它会降低性能。
【问题讨论】:
-
Matplotlib,就像任何其他 GUI 必须在主线程中运行一样。
标签: matplotlib pyside2