【问题标题】:Python: How Close (or exit) Python Process After QMainWindow Dialog is closedPython:QMainWindow 对话框关闭后如何关闭(或退出)Python 进程
【发布时间】:2014-03-17 20:50:38
【问题描述】:

有两个 .py 文件放在同一个文件夹中:

dialog_01.py and dialog_02.py

这两个文件是彼此的副本。两者都构建了一个带有两个按钮的简单 QMainWindow 对话窗口:“确定”和“取消”。

单击“确定”按钮关闭当前打开的对话窗口并打开另一个。因此,如果单击 Dialog_01 的 Ok 按钮,则 dialog_01 将关闭,而 dialog_02 将打开。如果单击 Dialog_02 的 Ok 按钮,则关闭 dialog_02 并打开 dialog_01,依此类推。

编辑问题:

关闭对话框使 Python 进程仍在后台运行(可以在 OSX 活动监视器或 Windows 任务管理器中看到)。

如何确保 Python 进程在对话框窗口关闭后终止?

dialog_01.py

import sys, os
from PyQt4 import QtCore, QtGui    
if 'app' not in globals().keys(): app = QtGui.QApplication(sys.argv)

class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()       

        Cancel_button = QtGui.QPushButton("Cancel")
        Cancel_button.clicked.connect(self.Cancel)      
        myBoxLayout.addWidget(Cancel_button) 


        Button_01 = QtGui.QPushButton("Press to close this dialog and open Dialog 02")
        Button_01.clicked.connect(self.callAnotherQMainWindow)
        myBoxLayout.addWidget(Button_01)        

        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)
        self.setWindowTitle('Dialog 01')

    def callAnotherQMainWindow(self):
        from dialog_02 import Dialog_02
        self.close()
        self.dialog_02 = Dialog_02()
        self.dialog_02.show()
        self.dialog_02.raise_()

    def Cancel(self):
        self.close()

    def closeEvent(self):
        self.deleteLater()



if __name__ == '__main__':
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())

dialog_02.py

import sys, os
from PyQt4 import QtCore, QtGui    
if 'app' not in globals().keys(): app = QtGui.QApplication(sys.argv)

class Dialog_02(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()

        Cancel_button = QtGui.QPushButton("Cancel")
        Cancel_button.clicked.connect(self.Cancel)      
        myBoxLayout.addWidget(Cancel_button) 


        Button_02 = QtGui.QPushButton("Press to close this dialog 02 and re-open Dialog 01")
        Button_02.clicked.connect(self.callAnotherQMainWindow)
        myBoxLayout.addWidget(Button_02)

        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)
        self.setWindowTitle('Dialog 02')

    def callAnotherQMainWindow(self):
        from dialog_01 import Dialog_01
        self.close()
        self.dialog_01 = Dialog_01()
        self.dialog_01.show()
        self.dialog_01.raise_()

    def Cancel(self):
        self.close()

    def closeEvent(self):
        self.deleteLater()


if __name__ == '__main__':
    dialog_2 = Dialog_02()
    dialog_2.show()
    dialog_2.resize(480,320)
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt4 qmainwindow


    【解决方案1】:

    覆盖 QtGui.QMainWindow 类的 closeEvent() 函数,如下所示:

    def closeEvent(self, event):
        self.deleteLater()
    

    这似乎有效:

    删除这个:

    if 'app' not in globals().keys(): app = QtGui.QApplication(sys.argv)
    

    还有这个:

    if __name__ == '__main__':
        dialog_2 = Dialog_02()
        dialog_2.show()
        dialog_2.resize(480,320)
        sys.exit(app.exec_())
    

    ...来自 dialog2 文件成功了。

    【讨论】:

    • 感谢您的建议!但现在我得到了这个:TypeError: closeEvent() 只需要 1 个参数(给定 2 个)
    • 我刚刚编辑了原始问题中发布的代码,其中包含您建议的行。请看一下......因为我仍然在参数上遇到相同的错误:TypeError:closeEvent()恰好需要1个参数(给定2个)
    • 好吧,希望就是这样,我现在正在测试代码,看看是否能找到问题,也许我缺少一些简单的东西。
    • 我认为必须声明一个传入参数,例如: def closeEvent(self, event): self.deleteLater() .... 但这仍然让 Python 进程运行...跨度>
    • 哈,奇怪的是,我认为这不是问题所在,因为从技术上讲,您不需要“事件”,但是您摆脱了错误消息。嗯,我可以看到它仍然打开的一个原因是你只是从 self.deleteLater() 正确关闭了一个对话框,而另一个没有正确关闭。
    【解决方案2】:

    这是工作示例。

    dialog_01.py

    import sys, os
    from PyQt4 import QtCore, QtGui  
    
    class Dialog_01(QtGui.QMainWindow):
        def __init__(self):
            super(QtGui.QMainWindow,self).__init__()
    
            myQWidget = QtGui.QWidget()
            myBoxLayout = QtGui.QVBoxLayout()       
    
            Cancel_button = QtGui.QPushButton("Cancel")
            Cancel_button.clicked.connect(self.Cancel)      
            myBoxLayout.addWidget(Cancel_button) 
    
    
            Button_01 = QtGui.QPushButton("Press to close this dialog and open Dialog 02")
            Button_01.clicked.connect(self.callAnotherQMainWindow)
            myBoxLayout.addWidget(Button_01)        
    
            myQWidget.setLayout(myBoxLayout)
            self.setCentralWidget(myQWidget)
            self.setWindowTitle('Dialog 01')
    
        def callAnotherQMainWindow(self):
            from dialog_02 import Dialog_02
            self.close()
            self.dialog_02 = Dialog_02()
            self.dialog_02.show()
            self.dialog_02.raise_()
    
        def Cancel(self):
            self.close()
    
        # def closeEvent(self, event):
        #     self.deleteLater()
    
    
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        dialog_1 = Dialog_01()
        dialog_1.show()
        dialog_1.resize(480,320)
        sys.exit(app.exec_())
    

    dialog_02.py

    import sys, os
    from PyQt4 import QtCore, QtGui    
    
    class Dialog_02(QtGui.QMainWindow):
        def __init__(self):
            super(QtGui.QMainWindow,self).__init__()
    
            myQWidget = QtGui.QWidget()
            myBoxLayout = QtGui.QVBoxLayout()
    
            Cancel_button = QtGui.QPushButton("Cancel")
            Cancel_button.clicked.connect(self.Cancel)      
            myBoxLayout.addWidget(Cancel_button) 
    
    
            Button_02 = QtGui.QPushButton("Press to close this dialog 02 and re-open Dialog 01")
            Button_02.clicked.connect(self.callAnotherQMainWindow)
            myBoxLayout.addWidget(Button_02)
    
            myQWidget.setLayout(myBoxLayout)
            self.setCentralWidget(myQWidget)
            self.setWindowTitle('Dialog 02')
    
        def callAnotherQMainWindow(self):
            from dialog_01 import Dialog_01
            self.close()
            self.dialog_01 = Dialog_01()
            self.dialog_01.show()
            self.dialog_01.raise_()
    
        def Cancel(self):
            self.close()
    
        # def closeEvent(self, event):
        #     self.deleteLater()
    
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        dialog_2 = Dialog_02()
        dialog_2.show()
        dialog_2.resize(480,320)
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多