2016-11-30 3 views
1

Во-первых, я попытался изо всех сил найти решение этой проблемы здесь и в других местах, и у меня есть общее представление о том, в чем проблема, но мне непонятно, как решить Это.Ошибка сегментации при выходе из приложения 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 
+0

Простое мышление - QApplication.closeAllWindows() закрывает окна и ev.accept() пытается закрыть закрытое окно правильно? Но я думаю, что ошибка сегментации возникает в блоке кода «del app» внизу. – obayhan

+0

Спасибо за ответ. Я пробовал комментировать все три строки, которые вы упоминаете, и то же самое происходит независимо .... –

+0

Интересно. Когда я пытаюсь запустить код, я получаю Я не знаю, как вы справились с этим, но, возможно, дело в этом. (я получаю эту ошибку из-за pyqtgraph, я думаю) – obayhan

ответ

2

Проблема о pyqtgraph (который использует PyQt4) и импорт PyQt5. pyqtgraph пытается использовать что-то принадлежит PyQt4, который был переоценен импортом PyQt5. Это вызывает ошибку сегментации.

+1

обновление: я обновился до Python 3.6 из 3.5.2, и это уже не проблема. –

+0

Возможно, pyqtgraph использует pyqt5 в python3 или в более новой версии – obayhan

Смежные вопросы