PyQT: как открыть новое окно

Прежде всего, на подобные вопросы уже был дан ответ, но мне нужна помощь с этим.

У меня есть окно, которое содержит одну кнопку (Class First), и я хочу нажать, появится второе пустое окно (Class Second).

Я воспользовался кодом, скопированным из этого вопроса: PyQT при щелчке на открывшемся новом окне, и я написал этот код:

# -*- coding: utf-8 -*-

from PyQt4 import QtGui, QtCore
import sys
import design1, design2

class Second(QtGui.QMainWindow, design2.Ui_MainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)
        self.setupUi(self)

class First(QtGui.QMainWindow, design1.Ui_MainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.setupUi(self)

        self.pushButton.clicked.connect(self.on_pushButton_clicked)
        self.dialog = Second(self)

    def on_pushButton_clicked(self):
        self.dialog.exec_()

def main():
    app = QtGui.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()  

но on_pressed, появляется следующее сообщение об ошибке:

AttributeError: 'Second' object has no attribute 'exec_'

(design1 и design2 были получены от дизайнера Qt.)

Любая мысль была бы оценена.

Ответ 1

Я думаю, что вы должны использовать метод show.

Вот рабочий пример (производный от вашего):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PyQt4 import QtGui, QtCore
import sys


class Second(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)


class First(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.pushButton = QtGui.QPushButton("click me")

        self.setCentralWidget(self.pushButton)

        self.pushButton.clicked.connect(self.on_pushButton_clicked)
        self.dialog = Second(self)

    def on_pushButton_clicked(self):
        self.dialog.show()


def main():
    app = QtGui.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Если вам нужно новое окно каждый раз, когда вы нажимаете кнопку, вы можете изменить код, созданный в диалоге внутри метода the on_pushButton_clicked

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PyQt4 import QtGui, QtCore
import sys


class Second(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)


class First(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.pushButton = QtGui.QPushButton("click me")

        self.setCentralWidget(self.pushButton)

        self.pushButton.clicked.connect(self.on_pushButton_clicked)
        self.dialogs = list()

    def on_pushButton_clicked(self):
        dialog = Second(self)
        self.dialogs.append(dialog)
        dialog.show()


def main():
    app = QtGui.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Ответ 2

В приведенном выше примере при запуске программы занято 18 МБ ОЗУ. При запуске второго экрана еще 4 МБ будет занято ОЗУ. Когда мы закрываем вторую страницу, занятая память не будет возвращена Риму, и если вторая страница открывается во второй раз, то снова будет занято 4 МБ ОЗУ. Каково ваше решение для этой проблемы?