2016-11-30 2 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는 PyQt5 가져 오기가 재정의 한 PyQt4에 속합니다. 세그먼트 화 오류가 트리거됩니다.

+1

업데이트 : 3.5.2에서 Python 3.6으로 업그레이드했는데 더 이상 문제가되지 않습니다. –

+0

아마도 pyqtgraph가 python3 또는 최신 버전에서 pyqt5를 사용하고 있습니다. – obayhan