2012-02-26 2 views
1

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

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

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_().

ответ

4

Вы не можете создать несколько 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_()) 

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

Затем, когда вы хотите, чтобы показать другой диалог из с приложением ... скажем 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() метод объекта UI заставляет меня думать, вы изменяете файл пользовательского интерфейса и добавление функциональности к нему, которую вы не должны делать. Этот файл ui может быть перезаписан каждый раз, когда вы вносите изменения в QT Designer и сохраняете новый. Им следует импортировать его и использовать его метод setupUI(), чтобы применить его к вашим собственным пользовательским классам.

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

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

0

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

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

Я считаю, что это неправильно и ведет его по неправильному пути. Он не должен создавать несколько объектов QApplication. См. Мой ответ. – jdi

+0

@jdi - согласился! - но немного сложно рассказать об этом контексте и фрагментах – hooblei

+0

Я согласен, что его примеры кода немного запутывают. Но я думаю, вы действительно можете сказать, что он определяет свой другой модуль, чтобы также иметь метод main(), который устанавливает свой собственный QApp перед показом. – jdi

Смежные вопросы