chicken-me
chicken-me

Reputation: 141

pyqt4 Main window crashes after second window closes

I've got this simple program. Its has a button and when you press it a second window will come up.

    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    import sys

    import urllib.request

    class second_window(QDialog):
        def __init__(self, parent=None):
            QDialog.__init__(self)
            super(second_window, self).__init__(parent)

            layout = QVBoxLayout()

            button = QPushButton("close") 

            button.clicked.connect(self.button_clicked)

            layout.addWidget(button)
            self.setLayout(layout)
        def button_clicked(self):
            self.close()

    class Main_window(QDialog):

        def __init__(self):
            QDialog.__init__(self)
            layout = QVBoxLayout()

            button = QPushButton("Second Window")
            self.sec_window = second_window(self)

            layout.addWidget(button)

            button.clicked.connect(self.button_clicked)

            self.setLayout(layout)

        def button_clicked(self):
            self.sec_window.exec_()
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        dl = window()
        dl.show()
        app.exec()

But sometimes if you close the Main_window just after you close the second_window it crashes and I get a message saying "Python.exe has stopped working". can anyone help?

Upvotes: 0

Views: 86

Answers (1)

eyllanesc
eyllanesc

Reputation: 244282

First Solution: Change self.sec_window = second_window(self) to self.sec_window = second_window() since it will not be necessary to clean because there is no relationship between second_window and Main_window. As the following code shows

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys


class second_window(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self)
        super(second_window, self).__init__(parent)

        layout = QVBoxLayout()

        button = QPushButton("close")

        button.clicked.connect(self.button_clicked)

        layout.addWidget(button)
        self.setLayout(layout)

    def button_clicked(self):
        self.close()


class Main_window(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        layout = QVBoxLayout()

        button = QPushButton("Second Window")
        self.sec_window = second_window()

        layout.addWidget(button)

        button.clicked.connect(self.button_clicked)

        self.setLayout(layout)

    def button_clicked(self):
        self.sec_window.exec_()



if __name__ == "__main__":
    app = QApplication(sys.argv)
    dl = Main_window()
    dl.show()
    app.exec()

Second Solution: Add self.sec_window.deleteLater() on closeEvent(self, event) to be able to delete second_window

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys


class second_window(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self)
        super(second_window, self).__init__(parent)

        layout = QVBoxLayout()

        button = QPushButton("close")

        button.clicked.connect(self.button_clicked)

        layout.addWidget(button)
        self.setLayout(layout)

    def button_clicked(self):
        self.close()


class Main_window(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        layout = QVBoxLayout()

        button = QPushButton("Second Window")
        self.sec_window = second_window(self)

        layout.addWidget(button)

        button.clicked.connect(self.button_clicked)

        self.setLayout(layout)

    def button_clicked(self):
        self.sec_window.exec_()

    def closeEvent(self, event):
        self.sec_window.deleteLater()
        super().closeEvent(event)



if __name__ == "__main__":
    app = QApplication(sys.argv)
    dl = Main_window()
    dl.show()
    app.exec()

Upvotes: 1

Related Questions