Jac*_*ack 1 python qt4 pyqt pyqt4
我有一个主对话框,在那个对话框上有一个按钮。单击按钮时,我想打开另一个对话框。
主对话框代码(在主对话框中单击按钮时调用的函数):
def add_host(self):
x=add_host.Ui_Dialog1()
x.main()
Run Code Online (Sandbox Code Playgroud)
默认功能:
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_())
Run Code Online (Sandbox Code Playgroud)
辅助对话框(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_())
Run Code Online (Sandbox Code Playgroud)
因此,当我运行代码时,它会打开辅助对话框,但是当我关闭它时,它会冻结,并收到以下错误消息:
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
Run Code Online (Sandbox Code Playgroud)
这确实有道理,但我不知道如何解决。我尝试了几种组合都没有成功,包括添加和删除app.exec_().
您不能在同一个脚本和线程中创建多个 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_())
Run Code Online (Sandbox Code Playgroud)
没有全球应用。尽管您应该在对话框的类中进行 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_()
Run Code Online (Sandbox Code Playgroud)
您创建一个 QApplication 并通过调用exec_(). 从那时起,您的主应用程序可以自由地创建更多 QWidget。在这一点上,您永远不会再创建另一个 QApplication。
另外,我不明白您代码的这一部分:
def add_host(self):
x=add_host.Ui_Dialog1()
x.main()
Run Code Online (Sandbox Code Playgroud)
您main()在 UI 对象上调用方法这一事实让我认为您正在修改 UI 文件并向其添加功能,而您不应该这样做。每次您在 QT Designer 中进行更改并保存一个新文件时,该 ui 文件都会被覆盖。您应该只导入它并使用其 setupUI() 方法将其应用于您自己的自定义类。
关于模块组织的说明
当您设计 PyQT 应用程序时,您将始终拥有一个单独的入口点,该入口点将被调用以启动您的应用程序。这是应该创建 QApp 并启动事件循环的唯一且唯一的位置,并且通常在if __name__ == "__main__"块中完成以确保仅在其主脚本时完成。它不应该在您的对象的方法中完成。对于您定义其他对话框、小部件等的所有其他模块,这些应该只是您导入的类。只要您有一个正在运行的 QApp,您就可以自由地创建和显示这些小部件。