Как держать QMainWindow открытым?

У меня есть файл пользовательского интерфейса, который я создал с помощью Qt Creator. Когда я запускаю приложение через PyCharm, главное окно ненадолго открывается, а затем закрывается. Я предполагаю, что это сборщик мусора, но я не уверен, как заставить это работать. Любые идеи?

Калькулятор.py

from PyQt5.QtWidgets import QApplication
import MainWindow
import sys


class Calculator(QApplication):

    def __init__(self):
        args = sys.argv
        QApplication.__init__(self, args)
        self.initializeApplication()

    def initializeApplication(self):
        app = MainWindow.MainWindow()
        app.show()


if __name__ == '__main__':
    app = Calculator()
    sys.exit(app.exec_())

MainWindow.py

from PyQt5 import uic
from PyQt5.QtWidgets import QMainWindow


class MainWindow(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self, None)
        uic.loadUi(r'interface/MainWindow.ui', self)
        self.initializeUI()

    def initializeUI(self):
        self.setWindowTitle('Calculator')

Я новичок в Python, поэтому, пожалуйста, потерпите меня. Я просмотрел несколько разных примеров, но ничего особенного, когда ваше приложение охватывает несколько исходных файлов. Спасибо.


person artomason    schedule 19.11.2017    source источник


Ответы (1)


Комментарий о том, что сборщик мусора удаляет его, правильный, поскольку переменные, созданные в функции, существуют только во время вызова функции. Кроме того, чтобы иметь возможность запускать графический интерфейс, вы должны вызвать exec_() для создания необходимого основного цикла.

class Calculator(QApplication):

    def __init__(self):
        args = sys.argv
        QApplication.__init__(self, args)
        self.initializeApplication()
        self.exec_()

    def initializeApplication(self):
        self.app = MainWindow.MainWindow()
        self.app.show()


if __name__ == '__main__':
    app = Calculator()
person eyllanesc    schedule 19.11.2017
comment
Кажется, это работает отлично, спасибо! Есть ли более чистый способ сделать это. Все, что я читал, и примеры, которые я рассматривал, похоже, работают по-разному. - person artomason; 20.11.2017
comment
Этот метод я считаю адекватным. Не забудьте отметить мой ответ как правильный. - person eyllanesc; 20.11.2017