Как вызвать несколько диалогов в PyQt? - PullRequest
1 голос
/ 26 февраля 2012

У меня есть главное диалоговое окно, и в этом диалоговом окне есть кнопка. Когда кнопка нажата, я хочу открыть еще одно диалоговое окно.

Код основного диалога (функция, которая вызывается при нажатии кнопки в главном диалоговом окне):

def add_host(self):
        x=add_host.Ui_Dialog1()
        x.main()

функция по умолчанию:

if __name__ == "__main__":
    import sys
    global app
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

Снимок кода дополнительного диалогового окна (add_host.py):

def main(self):
        app1 = QtGui.QApplication(sys.argv)
        Dialog1 = QtGui.QDialog()
        ui1 = Ui_Dialog1()
        ui1.setupUi1(Dialog1)
        Dialog1.show()
        sys.exit(app.exec_())

Поэтому, когда я запускаю код, он открывает вторичное диалоговое окно, но когда я закрываю его, он просто зависает, и я получаю это сообщение об ошибке:

 File "testbot.py", line 175, in add_host
    x.main()
  File "/home/ppp/ppp/add_host.py", line 74, in main
    sys.exit(app.exec_())
NameError: global name 'app' is not defined

Что имеет смысл, но я понятия не имею, как ее решить. Я пробую несколько комбинаций без успеха, включая добавление и удаление app.exec_().

Ответы [ 2 ]

4 голосов
/ 26 февраля 2012

Вы не можете создать несколько приложений QApplications внутри одного скрипта и потока. Вы должны иметь только один ...

Это должно быть больше похоже на:

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

Нет глобального приложения. Хотя вы должны выполнять настройку из класса вашего диалога.

Затем, когда вы хотите показать еще одно диалоговое окно из вашего приложения ... скажем, main(), вы просто создаете его и вызываете show()

Вот действительно простой пример:

class Dialog(QDialog)
    def __init__(self, parent):
        super(Dialog, self).__init__(parent)
        self.otherDialog = QDialog(parent=self)

        self.otherDialog.show()


if __name__ == "__main__":
    app = QApplication([])
    dialog = Dialog()
    dialog.show()
    app.exec_()

Вы создаете отдельное приложение QApplication и запускаете цикл обработки событий, вызывая exec_(). С этого момента ваше основное приложение может создавать больше QWidgets. В этот момент вы никогда больше не создадите еще одно приложение QApplication.

Кроме того, я не понимаю эту часть вашего кода:

def add_host(self):
    x=add_host.Ui_Dialog1()
    x.main()

Тот факт, что вы вызываете метод main() для вашего объекта пользовательского интерфейса, заставляет меня думать, что вы модифицируете файл пользовательского интерфейса и добавляете в него функциональные возможности, чего не следует делать. Этот файл пользовательского интерфейса может быть перезаписан каждый раз, когда вы вносите изменения в QT Designer и сохраняете новый. Вам следует только импортировать его и использовать его метод setupUI (), чтобы применить его к вашим собственным пользовательским классам.

Замечание об организации ваших модулей

Когда вы разрабатываете приложение PyQT, у вас всегда будет одна точка входа, которая будет вызываться для запуска вашего приложения. Это единственное и единственное место, которое должно создавать ваше QApp и запускать цикл обработки событий, и обычно выполняется в блоке if __name__ == "__main__", чтобы обеспечить его выполнение только в том случае, если он является основным сценарием. Это не должно быть сделано в пределах методов ваших объектов. Для всех остальных ваших модулей, в которых вы определяете другие диалоги, виджеты и т. Д., Это должны быть просто классы, которые вы импортируете. Пока у вас работает QApp, вы можете создавать и показывать эти виджеты.

0 голосов
/ 26 февраля 2012

Ваш пример кода немного сбивает с толку - я не понимаю, почему у вас две сети и т. Д. - в любом случае, может быть, это просто опечатка в add_host.py (app1.exec_() вместо app.exec_())

def main(self):
    app1 = QtGui.QApplication(sys.argv)
    ...
    sys.exit(app1.exec_())
...