Have no problems with your code on Windows. Maybe you could try to add few
lines to the end of your code to look like:

if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
  app.exec_()
  app.deleteLater()
  sys.exit()

On Wed, Mar 1, 2017 at 3:45 PM, 'Fabian Isensee' via pyqtgraph <
[email protected]> wrote:

> Hey there,
> I implemented a very basic image viewer that is supposed to show a batch
> of image stacks that are synced together, meaning that the same slice
> number should be displayed for all stacks. The viewer runs very well, but I
> get a Segmentation fault (core dumped) after closing the application. I
> have been trying to fix this for a while now but don't find the mistake.
> Your help would be very much appreciated!
> Here is my code. It runs out of the box (displays random noise).
> Cheers,
> Fabian
>
> from pyqtgraph.Qt import QtGui, QtCore
> import pyqtgraph as pg
> import sys
> import numpy as np
>
> class ImageViewer2DWidget(QtGui.QWidget):
>     def __init__(self, width=300, height=300):
>         QtGui.QWidget.__init__(self)
>         self.image = None
>         self.init(width, height)
>
>     def init(self, width, height):
>         self.rect = QtCore.QRect(0, 0, width, height)
>         self.imageItem = pg.ImageItem()
>         self.imageItem.setImage(None)
>
>         self.graphicsScene = pg.GraphicsScene()
>         self.graphicsScene.addItem(self.imageItem)
>
>         self.graphicsView = pg.GraphicsView()
>         self.graphicsView.setRenderHint(QtGui.QPainter.Antialiasing)
>         self.graphicsView.setScene(self.graphicsScene)
>
>         layout = QtGui.QHBoxLayout()
>         layout.addWidget(self.graphicsView)
>         self.setLayout(layout)
>         self.setMaximumSize(width, height)
>         self.setMinimumSize(width-10, height-10)
>
>     def setImage(self, image):
>         assert len(image.shape) == 2 or len(image.shape) == 3
>         if len(image.shape) == 4:
>             assert image.shape[-1] == 4
>         self.image = image
>         self.imageItem.setImage(self.image)
>         self.imageItem.setRect(self.rect)
>
>     def setLevels(self, levels, update=True):
>         self.imageItem.setLevels(levels, update)
>
> class ImageSlicingWidget(ImageViewer2DWidget):
>     def __init__(self, width=300, height=300):
>         self.slice = 0
>         ImageViewer2DWidget.__init__(self, width, height)
>
>     def setImage(self, image):
>         assert len(image.shape) == 3 or len(image.shape) == 4
>         if len(image.shape) == 4:
>             assert image.shape[-1] == 4
>         self.image = image
>         self._updateImageSlice()
>
>     def _updateImageSlice(self):
>         self.imageItem.setImage(self.image[self.slice])
>         self.imageItem.setRect(self.rect)
>
>     def setSlice(self, slice):
>         slice = np.max((0, slice))
>         slice = np.min((slice, self.image.shape[0] - 1))
>         self.slice = slice
>         self._updateImageSlice()
>
>     def getSlice(self):
>         return self.slice
>
> class BatchViewer(QtGui.QWidget):
>     def __init__(self, width=300, height=300):
>         QtGui.QWidget.__init__(self)
>         self.batch = None
>         self.width = width
>         self.height = height
>         self.slicingWidgets = {}
>         self._init_gui()
>
>     def setBatch(self, batch):
>         assert len(batch.shape) == 4
>         for v in self.slicingWidgets.values():
>             self._my_layout.removeWidget(v)
>         self.slicingWidgets = {}
>
>         self.batch = batch
>         for i in range(self.batch.shape[0]):
>             w = ImageSlicingWidget(self.width, self.height)
>             w.setImage(self.batch[i])
>             w.setLevels([self.batch[i].min(), self.batch[i].max()])
>             w.setSlice(0)
>             self._my_layout.addWidget(w)
>             self.slicingWidgets[i] = w
>
>     def _init_gui(self):
>         self._my_layout = QtGui.QHBoxLayout()
>         self.slicingWidgets = {}
>         self.setLayout(self._my_layout)
>         self.setWindowTitle("Batch Viewer")
>
>     def wheelEvent(self, QWheelEvent):
>         for v in self.slicingWidgets.values():
>             v.setSlice(v.getSlice() + QWheelEvent.delta()/120)
>
>
>
> if __name__ == '__main__':
>     app = QtGui.QApplication(sys.argv)
>     sv = BatchViewer()
>     batch = np.random.random((5, 300, 300, 300))
>     sv.setBatch(batch)
>     sv.show()
>     if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
>         app.exec_()
>     # import IPython
>     # IPython.embed()
>
> --
> You received this message because you are subscribed to the Google Groups
> "pyqtgraph" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit https://groups.google.com/d/
> msgid/pyqtgraph/f99676ac-41d0-462f-b869-938f89a15bc1%40googlegroups.com
> <https://groups.google.com/d/msgid/pyqtgraph/f99676ac-41d0-462f-b869-938f89a15bc1%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"pyqtgraph" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyqtgraph/CAD_qyJoSbofzJOJkHpO7ZSTWwPNMoy0QUzf21umRax79t1_Zaw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to