我有一个主对话框,在该对话框上有一个按钮。单击该按钮时,我想打开另一个对话框。
主对话框代码(在主对话框中单击按钮时调用的功能):
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_()
。
答案 0 :(得分: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_()
您可以通过调用exec_()
创建单个QApplication并启动其事件循环。从那时起,您的主应用程序可以自由创建更多QWidgets。此时,您再也不会再次创建另一个QApplication。
另外,我不明白你代码的这一部分:
def add_host(self):
x=add_host.Ui_Dialog1()
x.main()
您在UI对象上调用main()
方法的事实使我认为您正在修改UI文件并向其添加功能,而您不应该这样做。每次在QT Designer中进行更改并保存一个新文件时,该ui文件都会被覆盖。您应该只导入它并使用其setupUI()方法将其应用于您自己的自定义类。
关于模块组织的说明
当您设计PyQT应用程序时,您将始终只有一个入口点可以启动您的应用程序。这是应该创建QApp并启动事件循环的唯一且唯一的位置,通常在if __name__ == "__main__"
块中完成,以确保它仅在其主脚本时完成。它不应该在对象的方法中完成。对于您定义其他Dialog,Widgets等的所有其他模块,这些模块应该只是您导入的类。只要您有一个正在运行的QApp,您就可以自由地创建和显示这些小部件。
答案 1 :(得分:0)
你的代码示例有点令人困惑 - 我不明白为什么你有两个主电源等等 - 无论如何,也许这只是add_host.py(app1.exec_()
而不是app.exec_()
)中的一个错字<) / p>
def main(self):
app1 = QtGui.QApplication(sys.argv)
...
sys.exit(app1.exec_())