Как правильно управлять окнами в pyqt5? - PullRequest
0 голосов
/ 11 сентября 2018

В приложении, которое я создаю, у меня есть несколько «окон», с которыми я работаю.Я пытаюсь выяснить, в соответствии с python / отраслевыми стандартами, как правильно ими управлять.У меня есть экран предупреждения, экран отказа от ответственности, основной графический интерфейс и, по сути, окно сообщения для сообщения об ошибках.

То, что мой клиент хотел бы выяснить, это программа, отображающая экран предупреждения (QDialog), затем экран отказа от ответственности (QDialog) при нажатии кнопки, затем основной графический интерфейс (QMainWindow) после того, как пользователь согласился наотказ от ответственности.Окно сообщения используется только тогда, когда пользователь должен быть предупрежден о каком-либо событии. Примечание: я использую qt desinger

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

Пока что мой графический контроллер не работает.Первоначально я создал класс для каждого из окон, а затем попытался создать объекты для каждого в графическом контроллере.Я был вынужден переместить все классы в один файл, удалить код класса контроллера графического интерфейса и использовать этот файл в качестве «основного» для приложения, чтобы даже получить первое окно для запуска.Я все еще не могу переключаться между окнами, в лучшем случае я могу закрыть то, что открыто в данный момент. Как правильно структурировать подобное приложение в Python3 / PyQt5?

Некоторый код:

#There used to be another class for gui_controller that instantiated all the below (pyqt5 doesn't work this way as I've come to learn)

#Used to be in its own file.
class WarningScreen(QDialog, Ui_SomeWarningScreen):

    def __init__(self, parent=None):
        super(WarningScreen, self).__init__(parent)
        self.setupUi(self)
        self.accept_button_2.clicked.connect(self.acknowledge_warning)

    def acknowledge_warning(self):
        window = Disclaimer()
        window.show()
        self.close()

#Used to be in its own file.
class DisclaimerScreen(QDialog, Ui_UsageDislaimer):

    def __init__(self, parent=None):
        super(DisclaimerScreen, self).__init__(parent)
        self.setupUi(self)

#This was initially in the main class for the application.
if __name__ == "__main__":

    APP = QApplication(sys.argv)

    WINDOW = WarningScreen()

    WINDOW.show()

    sys.exit(APP.exec_())

1 Ответ

0 голосов
/ 11 сентября 2018

Открытое окно не показывается простым фактом, локальные переменные удаляются по завершении его области действия, в вашем случае window = Disclaimer() - это локальная переменная, которая будет удалена, поэтому возможное решение:

def acknowledge_warning(self):
    self.window = Disclaimer()
    self.window.show()
    self.close()

Хотя лучшим вариантом является создание класса или функции, в которой реализована логика взаимодействия между окнами, в следующей части я покажу пример:

class WarningScreen(QtWidgets.QDialog, Ui_SomeWarningScreen):
    closed = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(WarningScreen, self).__init__(parent)
        self.setupUi(self)
        self.accept_button_2.clicked.connect(self.close)
        self.accept_button_2.clicked.connect(self.closed)


class DisclaimerScreen(QtWidgets.QDialog, Ui_UsageDislaimer):
    def __init__(self, parent=None):
        super(DisclaimerScreen, self).__init__(parent)
        self.setupUi(self)


class Controller:
    def __init__(self):
        self.warning = WarningScreen()
        self.disclaimer = DisclaimerScreen()

        self.warning.closed.connect(self.disclaimer.show)
        self.warning.show()

if __name__ == "__main__":
    import sys

    APP = QtWidgets.QApplication(sys.argv)
    w = Controller()
    sys.exit(APP.exec_())
...