Как избежать ошибки «Ошибка сегментации» при построении двух виджетов с помощью PyVista? - PullRequest
0 голосов
/ 24 сентября 2019

Я создал графический интерфейс с PyQt5, где есть область, в которой я хотел бы построить несколько томов.Я иногда хочу нарезать тома, для которых я использую виджет "add_mesh_clip_plane" PyVista.В первый раз он всегда работает нормально, но когда я пытаюсь построить другой том с той же функцией нарезки в том же QFrame, программа вылетает, и я получаю ошибку «Ошибка сегментации (ядро сброшено)»,

Кто-нибудь знает / есть какие-либо идеи о том, как я мог бы решить эту проблему?

Я создал небольшой пример (код, который будет найден ниже), где QFrame строит мозг или голову Нефертити с помощью этого виджета срезаобъявление воли пользователя.

Перед построением каждого из них я очищаю QFrame от всех акторов и удаляю все их свойства с помощью функции "clear ()", поэтому мне хотелось бы избежать ситуации:

1-щелкните на графике Нефертити 2 - щелкните либо на графике Нефертити, либо на графике мозга 3 - при щелчке в области QFrame для перемещения виджета среза программа вылетает

Я хочу завершить удаление сетки до шага 2),так что шаг 2) работает так же, как шаг 1)

Я попытался удалить весь объект QFrame и создать его заново с нуля, но безрезультатно

PyQt5 GUI:

---------------------------------

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'double_plot.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtWidgets  # QtGui


class Ui_Test(object):
    def setupUi(self, Test):
        Test.setObjectName("Test")
        Test.resize(642, 574)
        self.widget = QtWidgets.QWidget(Test)
        self.widget.setGeometry(QtCore.QRect(110, 30, 402, 433))
        self.widget.setObjectName("widget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.vtkFrame = QtWidgets.QFrame(self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                           QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.vtkFrame.sizePolicy().
                                     hasHeightForWidth())
        self.vtkFrame.setSizePolicy(sizePolicy)
        self.vtkFrame.setMinimumSize(QtCore.QSize(400, 400))
        self.vtkFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.vtkFrame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.vtkFrame.setObjectName("vtkFrame")
        self.verticalLayout.addWidget(self.vtkFrame)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.plotNef_button = QtWidgets.QPushButton(self.widget)
        self.plotNef_button.setObjectName("plotNef_button")
        self.horizontalLayout.addWidget(self.plotNef_button)
        self.plotBrain_button = QtWidgets.QPushButton(self.widget)
        self.plotBrain_button.setObjectName("plotBrain_button")
        self.horizontalLayout.addWidget(self.plotBrain_button)
        self.verticalLayout.addLayout(self.horizontalLayout)

        self.retranslateUi(Test)
        QtCore.QMetaObject.connectSlotsByName(Test)

    def retranslateUi(self, Test):
        _translate = QtCore.QCoreApplication.translate
        Test.setWindowTitle(_translate("Test", "Test"))
        self.plotNef_button.setText(_translate("Test", "Plot Nefertiti"))
        self.plotBrain_button.setText(_translate("Test", "Plot Brain"))

Основной файл - исполняемый (python main.py)

-----------------------------------------------

import pyvista as pv
from pyvista import examples

from PyQt5 import QtWidgets

from double_plot import Ui_Test


class MainWindow(QtWidgets.QMainWindow, Ui_Test):
    def __init__(self, *args, **kwargs):
        QtWidgets.QMainWindow.__init__(self, *args, **kwargs)
        self.setupUi(self)

        self.mesh = None
        self.vtk_widget = pv.QtInteractor(self.vtkFrame)

        self.plotNef_button.clicked.connect(self.plot_nefertiti)
        self.plotBrain_button.clicked.connect(self.plot_brain)

    def plot_nefertiti(self):
        self.vtk_widget.clear()  # Remove all actors and properties
        self.mesh = examples.download_nefertiti()
        self.vtk_widget.add_mesh_clip_plane(self.mesh)
        self.vtk_widget.update()

    def plot_brain(self):
        self.vtk_widget.clear()  # Remove all actors and properties
        self.mesh = examples.download_brain()
        self.vtk_widget.add_mesh_clip_plane(self.mesh)
        self.vtk_widget.update()


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

Как указано выше, шаг 2 вызывает сбой программы, напоминание:

1 - нажмите на сюжет Нефертити 2 - щелкните либо на сюжет Нефертити, либо на участок мозга

при щелчке в области QFrame для перемещения виджета среза, прогрсбой (ТОЛЬКО ПОСЛЕ ШАГА 2)

...