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

时间:2015-06-25 12:25:39

标签: python qt matplotlib pyqt4

我使用matplotlib编写了一个脚本,它使用标准的matplotlib运行得很好。

表示脚本是以图为一类编写的,调用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 个答案:

答案 0 :(得分:0)

我遇到了与 Anaconda Python(x,y)相同的问题。然后我尝试从头开始安装 Python

  1. 蟒-2.7.10.msi
  2. PyQt4-4.11.4-GPL-Py2.7-Qt4.8.7-x32.exe
  3. VCForPython27.msi
  4. pip install matplotlib
  5. 它无法解决所有崩溃问题。你也可以试试这个:

    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()
    ...