解开涉及numpy和pyqt4的分割错误

2024-10-01 15:48:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一些实验代码,用来处理微观数据。我用了pyqt4,EMAN2和visvis。由于图像文件以4096*4096数组的形式出现,所以我需要对它们进行降采样,为此我使用scipy.misc.imresize()。虽然这段代码在没有pyqt包装的情况下运行得很好,但在程序本身中却不是这样,并抛出一个segfault。在

下面是python代码:

#!/usr/bin/python

import sys
import math
import numpy
import scipy

from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import  QAction,QIcon,QFileDialog,QPixmap,QHBoxLayout,\
                         QGraphicsScene, QGraphicsView, QGraphicsPixmapItem,\
                         QPen, QImage
from PyQt4.QtCore import SLOT,SIGNAL,Qt,QSize,QString, QByteArray

from EMAN2 import EMData, EMNumPy

from numpy import mean

from scipy.misc import imresize

from PyQt4 import QtGui, QtCore
import visvis as vv

app = vv.use('pyqt4')

class SpringMain(QtGui.QMainWindow):
    thickness = 20
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setWindowTitle('Spring')

        self.data = None
        self.view = None

        ########
        # VisVis
        ########

        Figure = app.GetFigureClass()
        self.fig = Figure(self)
        self.setCentralWidget(self.fig._widget)
        self.setGeometry(300,300,300,300)
        self.show()
        ######
        # Menu
        ######
        load = QAction(QIcon('icons/load.png'), 'Load', self)
        load.setShortcut('Ctrl+L')
        load.setStatusTip('Load Tiff')
        self.connect(load,SIGNAL('triggered()'),self.onLoad)

        algo = QAction(QIcon('icons/load.png'), 'Algorithm', self)
        algo.setShortcut('Ctrl+A')
        algo.setStatusTip('Apply Algorithm')
        self.connect(algo,SIGNAL('triggered()'),self.onAlgo)

        exit = QtGui.QAction(QtGui.QIcon('icons/exit.png'), 'Exit', self)
        exit.setShortcut('Ctrl+Q')
        exit.setStatusTip('Exit application')
        self.connect(exit,QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))

        self.statusBar()

        menubar = self.menuBar()
        _file = menubar.addMenu('&File')
        _file.addAction(exit)
        _file.addAction(load)
        _file.addAction(algo)

    def onLoad(self):
        fileName = QFileDialog.getOpenFileName(self, "Open Image", "/home/kai","EMData Files (*.mrc)")
        self.data = EMNumPy.em2numpy(EMData(str(fileName)))
        self.view = imresize(self.data,0.125)
        #vv.imshow(data)

    def onAlgo(self):
        p1 = QPen(Qt.red,2,Qt.DashDotLine)
        self.paintMarker([50,50],[200,200],p1)
        p2 = QPen(Qt.green,1,Qt.SolidLine)
        self.paintMarker([150,50],[400,100],p2)
        p3 = QPen(Qt.blue,1,Qt.DashLine)

    def paintMarker(self,start,stop,pen=None):
        x0,y0 = start
        x1,y1 = stop
        v = [x1-x0,y1-y0]
        norm= float(self.thickness)/math.sqrt(v[0]**2+v[1]**2)
        vOrth = [v[1],-v[0]]
        if pen is None:
            pen = QPen(Qt.green,2,Qt.SolidLine)

        self.scene.addLine(x0-norm*vOrth[0],y0-norm*vOrth[1],\
                           x0+norm*vOrth[0],y0+norm*vOrth[1],pen=pen)
        self.scene.addLine(x0-norm*vOrth[0]+v[0],y0-norm*vOrth[1]+v[1],\
                           x0+norm*vOrth[0]+v[0],y0+norm*vOrth[1]+v[1],\
                           pen=pen)

        self.scene.addLine(x0,y0,x1,y1,pen=pen)
        self.scene.addLine(x0+norm*vOrth[0],y0+norm*vOrth[1],\
                           x0+norm*vOrth[0]+v[0],y0+norm*vOrth[1]+v[1],\
                           pen=pen)
        self.scene.addLine(x0-norm*vOrth[0],y0-norm*vOrth[1],\
                           x0-norm*vOrth[0]+v[0],y0-norm*vOrth[1]+v[1]\
                           ,pen=pen)

if True:
    qtApp = QtGui.QApplication([''])
    m = SpringMain()
    qtApp.exec_()
else:
    em = EMData("IntermediateImage_20131016_200656.mrc")
    np = EMNumPy.em2numpy(em)
    im=imresize(np,0.125)
    print im.shape

不多,如你所见。我设法使用gdb提取了一个堆栈跟踪,但无法真正解释它:

^{pr2}$

你们中有谁能理解这一点吗?在

谢谢你!在


Tags: fromimportselfnormexitloadqtqtgui

热门问题