如何重启 PyQt4 应用程序

Posted

技术标签:

【中文标题】如何重启 PyQt4 应用程序【英文标题】:How to Restart PyQt4 Application 【发布时间】:2013-03-05 10:23:34 【问题描述】:

有没有办法重启PyQt应用QApplication

我有一个使用以下代码使用 pyqt4 和 python 2.6 创建的应用

app = QtGui.QApplication(sys.argv)

我有设置选项,我可以在其中设置一些设置。现在,当我保存设置时,我需要重新加载应用程序,以便新设置生效。无需最终用户退出并再次启动应用程序。

【问题讨论】:

就我个人而言,我只是编写它以便它可以重新加载设置而无需重新启动。但是这样做:在你的__main__ 中,让它捕获程序的退出原因。如果是RESTART(或类似的东西),重新启动应用程序(这是在循环中),否则退出? 【参考方案1】:

我遇到了类似的问题,只是在适当的地方使用了这个:

subprocess.Popen([__file__])
sys.exit(0)

这是一个简单的应用程序,不需要任何进一步的参数。

【讨论】:

【参考方案2】:

我解释一下我是怎么做到的:

我创建了一个额外的文件 main.py,它调用我的实际主程序文件 dash.py。 我发出一个重启信号(我的程序在 closeEvent 处自动更新),所以我需要为它发出一个信号。这是sn-ps,希望对你有帮助。

这个在我的主程序文件dash.py中

def restart(self):
    # create a signal equivalent to "void someSignal(int, QWidget)"
    self.emit(QtCore.SIGNAL("RESTARTREQUIRED"), True)

main.py 中的这个仅调用实际程序并重新启动应用程序

import sys
from PyQt4 import QtGui,QtCore
from bin import dash

if __name__ == "__main__":
    application = QtGui.QApplication(sys.argv)
    uDesk = dash.app()
    uDesk.show()
    uDesk.actionRestart.triggered.disconnect()
    # define restart slot
    @QtCore.pyqtSlot()
    def restartSlot():
        print 'Restarting app'
        global uDesk
        uDesk.deleteLater()
        uDesk = dash.app()
        uDesk.show()
        uDesk.actionRestart.triggered.disconnect()   
        uDesk.actionRestart.triggered.connect(restartSlot)
        print 'New app started !'

    QtCore.QObject.connect(uDesk,
                   QtCore.SIGNAL("RESTARTREQUIRED"),
                   restartSlot)
    uDesk.actionRestart.triggered.connect(restartSlot)
    sys.exit(application.exec_()) 

希望对您有所帮助!!

【讨论】:

【参考方案3】:

编辑:更改获取应用程序路径的方式

您可以启动一个新流程并退出您的流程,如下所示:(代码未测试,但基于this answer)

// Restart Application
def restart(self, abort):
    // Spawn a new instance of myApplication:
    proc = QProcess()
    //proc.start(self.applicationFilePath());
    import os
    proc.start(os.path.abspath(__file__))

    self.exit(0);

如果您不想子类化,则将其编码为 Qapplication 的方法,甚至是函数

【讨论】:

这行不通,因为使用 PyQt,QApplication.applicationFilePath() 返回 python 解释器的路径。 @Jeannot 哦,我不知道,我编辑了代码,使其使用os 模块 @Fabio Diniz,我将我的应用程序作为单实例应用程序。所以我不能启动同一个应用程序的另一个实例。我想我不能使用这种方法。【参考方案4】:

这就是我在 PySide 中重新启动井字游戏的方式(在 PyQt 中应该是一样的):

我有一个单独的课程 - QWidget 课程 - 其中编写了 井字游戏 游戏。要重新启动我使用的应用程序:

    import subprocess

    QPushButton() 像这样:

    self.button = QPushButton("Restart", self)

    buttonSlot 的连接:

    self.buton.clicked.connect(self.restartGame)

    此按钮的Slot,如下所示:

    def restartGame(self): self.close() subprocess.call("python" + " TicTAcToe.py", shell=True)

所有这些都属于同一类。它们的作用是:关闭游戏的活动窗口并创建一个新窗口。

这段代码在井字棋类中的样子:

import subprocess
class TicTacToe(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.button = QPushButton("Restart", self)
        self.buton.clicked.connect(self.restartGame)
    def restartGame(self):
        self.close()
        subprocess.call("python" + " TicTacToe.py", shell=True)

def main():
    app = QApplication(sys.argv)
    widget = TicTacToe()
    widget.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

编辑

我知道这并不能回答问题(它不会重新启动 QApplication),但我希望这对那些想要重新启动 QWidget 单节课的人有所帮助。

【讨论】:

以上是关于如何重启 PyQt4 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4 和 QtWebKit - 如何自动滚动视图?

如何在 OS X 上的 PyQt4 中更改应用程序菜单名称

PyQt4:如何使用保留空间制作undercorated窗口

如何更改 PyQt4 中的 QStyle 属性?

PyQt4(QTabWidget)如何改变标签页的位置

如何从 closeEvent 处理使用 PyQt4 检测注销/关闭?