Во-первых, я попытался изо всех сил найти решение этой проблемы здесь и в других местах, и у меня есть общее представление о том, в чем проблема, но мне непонятно, как решить Это.Ошибка сегментации при выходе из приложения PyQT
Основная проблема заключается в том, что я получаю ошибку сегментации, когда я закрываю приложение, нажимая стандартную кнопку «x».
Наиболее важные детали (я думаю), что я использую MacOS Sierra, python 3.5.2 и pyqt5.
Приложение, которое я создаю, очень свободно основано на другом проекте (Dioptas), который является относительно зрелым проектом. Я более или менее начинаю.
Когда я закрываю окно, терминал распечатывает, как указано в MainController.close_event():
> here
> closed
> accepted
> Segmentation fault: 11
Я пробовал много предложений в Интернете, и я абсолютно уверен, что это связано с питоном не закрывая все окна (возможно, из-за порядка, в котором они закрываются) QApplication.CloseAllWindows() говорит, что они закрыты в случайном порядке, с одной стороны). Если у кого-то есть предложение или решение, я бы очень признателен.
Ниже мой код:
import sys
import pyqtgraph as pg
import numpy as np
from PIL import Image
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class MainController(QWidget):
def __init__(self):
super().__init__
self.start()
self.create_signals()
def start(self):
self.widget = MainWidget()
self.widget.show()
def create_signals(self):
self.widget.closeEvent = self.close_event
def close_event(self, ev):
print("here")
QApplication.closeAllWindows()
print("closed")
ev.accept()
class MainWidget(QWidget):
def __init__(self, *args, **kwargs):
super(MainWidget, self).__init__(*args, **kwargs)
self.layout = QHBoxLayout()
self.layout.setContentsMargins(2, 2, 2, 2)
self.layout.setSpacing(6)
self.stepFilterDisplayWidget = StepFilterDisplayWidget()
self.stepFilterControlWidget = StepFilterControlWidget()
self.layout.addWidget(self.stepFilterDisplayWidget)
self.layout.addWidget(self.stepFilterControlWidget)
self.setLayout(self.layout)
self.setGeometry(100,100,1000,700)
class StepFilterDisplayWidget(QWidget):
def __init__(self, *args, **kwargs):
super(StepFilterDisplayWidget,self).__init__(*args,**kwargs)
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.plot = pg.ImageView()
self.layout.addWidget(self.plot)
self.button = QPushButton("Plot", self)
self.button.clicked.connect(self.showImage)
self.layout.addWidget(self.button)
def showImage(self):
im = Image.open('S_15a_crop.tif')
self.data = np.array(im)
self.plot.setImage(self.data)
class StepFilterControlWidget(QWidget):
def __init__(self, *args, **kwargs):
super(StepFilterControlWidget, self).__init__(*args, **kwargs)
if __name__ == "__main__":
app = QApplication(sys.argv)
controller = MainController()
app.exec_()
del app
Простое мышление - QApplication.closeAllWindows() закрывает окна и ev.accept() пытается закрыть закрытое окно правильно? Но я думаю, что ошибка сегментации возникает в блоке кода «del app» внизу. – obayhan
Спасибо за ответ. Я пробовал комментировать все три строки, которые вы упоминаете, и то же самое происходит независимо .... –
Интересно. Когда я пытаюсь запустить код, я получаю Я не знаю, как вы справились с этим, но, возможно, дело в этом. (я получаю эту ошибку из-за pyqtgraph, я думаю) –
obayhan