由于导入,在使用 qt4agg 运行 matplotlib 后关闭时 Python 脚本崩溃

Posted

技术标签:

【中文标题】由于导入,在使用 qt4agg 运行 matplotlib 后关闭时 Python 脚本崩溃【英文标题】:Python script crashes when closing after running matplotlib with qt4agg because of import 【发布时间】:2015-06-25 12:25:39 【问题描述】:

我使用 matplotlib 编写了一个脚本,它在标准 matplotlib 上运行得很好。脚本是用 plot 作为一个类编写的,调用 Plot() 就足以让它运行。

现在我想在工具栏中添加一些按钮,为此我使用的是 qt4agg,因为我已经通过 Anaconda 安装了 matplotlib。在为主窗口编写代码时,我使用了this 示例,它运行得很好。为了使用我已经编写的绘图脚本,我想将在 QT 脚本中创建的图形传递给 Plot() 类。

这个解决方案工作得很好,直到我尝试关闭窗口。窗口关闭,python 崩溃。即使我不调用 Plot() 类,它也会崩溃,让它不崩溃的唯一方法是删除导入文件的行。将脚本导入窗口时,我需要考虑什么特别的事情吗?

from __future__ import print_function
import sys
from matplotlib.figure import Figure
from matplotlib.backend_bases import key_press_handler
### LINE CAUSING TROUBLE
from plotting import Plot
###
from test import *
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.backends import qt_compat
use_pyside = qt_compat.QT_API == qt_compat.QT_API_PYSIDE

if use_pyside:
    print ("USING PYSIDE")
    from PySide.QtCore import *
    from PySide.QtGui import *
else:
    print("NOT USING PYSIDE")
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *

class AppForm(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.create_main_frame()
        self.on_draw()

    def create_main_frame(self):
        self.main_frame = QWidget()

        self.fig = Figure()
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(self.main_frame)
        self.canvas.setFocusPolicy(Qt.StrongFocus)
        self.canvas.setFocus()

        self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)

        self.canvas.mpl_connect('key_press_event', self.on_key_press)

        vbox = QVBoxLayout()
        vbox.addWidget(self.canvas)
        vbox.addWidget(self.mpl_toolbar)
        self.main_frame.setLayout(vbox)
        self.setCentralWidget(self.main_frame)

    def on_draw(self):
        self.fig.clear()
        #Plot(self.fig)
        self.canvas.draw()

    def on_key_press(self, event):
        key_press_handler(event, self.canvas, self.mpl_toolbar)

def main():
    app = QApplication(sys.argv)
    form = AppForm()
    form.show()
    app.exec_()

if __name__ == "__main__":
    main()

这是另一个仍然导致错误的文件的非常压缩的版本。

import matplotlib.pyplot as pplt

class Plot():
    def __init__(self, figure=pplt.figure()):
        self.figure = figure

【问题讨论】:

【参考方案1】:

我在使用 AnacondaPython(x,y) 时遇到了同样的问题。然后我尝试从头开始安装 Python

    python-2.7.10.msi PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe VCForPython27.msi 点安装matplotlib

它并不能解决所有的崩溃问题。你也可以试试这个:

self.setAttribute(Qt.WA_DeleteOnClose)

例如:

class AppForm(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setAttribute(Qt.WA_DeleteOnClose) # <---
        self.create_main_frame()
        self.on_draw()
...

【讨论】:

以上是关于由于导入,在使用 qt4agg 运行 matplotlib 后关闭时 Python 脚本崩溃的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:无法从“matplotlib.mlab”导入名称“PCA”

由于 ImportError,Python 无法运行:无法导入 MAXREPEAT

Jupyter 中的内联动画

pylab.show() "QCoreApplication::exec: 事件循环已经在运行"

机器学习模型实例及其应用

机器学习模型实例及其应用