Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 退出PyQT应用程序时出现分段错误_Python_Pyqt_Pyqtgraph - Fatal编程技术网

Python 退出PyQT应用程序时出现分段错误

Python 退出PyQT应用程序时出现分段错误,python,pyqt,pyqtgraph,Python,Pyqt,Pyqtgraph,首先,我已经尽了最大努力在这里和其他地方找到了解决这个问题的办法,我对这个问题有一个大致的概念,但我不清楚如何解决它 基本问题是,当我按下标准的“x”按钮关闭我的应用程序时,我遇到了一个分段错误 最重要的细节(我认为)是我正在使用MacOS Sierra、Python3.5.2和pyqt5 我正在构建的应用程序非常松散地基于另一个项目(),这是一个相对成熟的项目。我差不多已经开始了 当我关闭窗口时,终端将按照MainController.close_event()中的指示打印出来: 我在网上尝试

首先,我已经尽了最大努力在这里和其他地方找到了解决这个问题的办法,我对这个问题有一个大致的概念,但我不清楚如何解决它

基本问题是,当我按下标准的“x”按钮关闭我的应用程序时,我遇到了一个分段错误

最重要的细节(我认为)是我正在使用MacOS Sierra、Python3.5.2和pyqt5

我正在构建的应用程序非常松散地基于另一个项目(),这是一个相对成熟的项目。我差不多已经开始了

当我关闭窗口时,终端将按照MainController.close_event()中的指示打印出来:

我在网上尝试了许多建议,我相当肯定这是因为python没有关闭所有窗口(可能是因为它们关闭的顺序——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

问题在于pyqtgraph(使用PyQt4)和PyQt5导入。pyqtgraph试图使用属于PyQt4的内容,该内容已被PyQt5导入覆盖。这会触发分段错误。

正在思考-QApplication.closeAllWindows()关闭窗口,ev.accept()尝试关闭关闭的窗口,对吗?但我认为分割错误发生在底部的“del app”代码块中。感谢您的回复。我试着把你提到的三句话都注释掉了,但同样的事情还是发生了……很有趣。当我试着运行我得到的代码时,我不知道你是如何处理的,但问题可能就在于此。(我得到这个错误是因为我认为pyqtgraph)嗯,这是一个有趣的观点;我必须覆盖一个标志才能在Sierra上安装pyqtgraph。也许这就是问题所在。是的,当我注释掉pyqtgraph行时,就没有问题了。更新:我从3.5.2升级到了Python 3.6,这不再是问题。pyqtgraph可能在python3或更新版本中使用pyqt5
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