Вы не можете создать несколько приложений 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, вы можете создавать и показывать эти виджеты.