2016-11-30 70 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

Just thinking - 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