由于导入,在使用 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】:我在使用 Anaconda 和 Python(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