如何重启PyQt4应用程序

时间:2013-03-05 10:23:34

标签: python pyqt4 application-restart

有没有办法重启PyQt应用程序QApplication

我使用pyqt4和python 2.6使用下面的代码

创建了一个应用程序

app = QtGui.QApplication(sys.argv)

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

4 个答案:

答案 0 :(得分:3)

我有类似的问题,只是在适当的地方使用它:

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

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

答案 1 :(得分:2)

我解释了我是如何做到的:

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

这个是在我的主程序文件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_()) 

希望这有用!!

答案 2 :(得分:0)

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

您可以启动一个新流程并退出您的流程,如下所示:(代码未经测试,但基于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的一种方法,如果您不想进行子类化,则将其编码为

答案 3 :(得分:0)

这是我在 PySide 中重启TicTacToe游戏的方式(在 PyQt 中它应该是相同的):

我有一个班级 - QWidget班级 - 其中编码 Tic Tac Toe 游戏。要重新启动应用程序,我使用:

  1. import subprocess

  2. QPushButton()喜欢这样:

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

  3. buttonSlot

    的关联

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

  4. 此按钮的Slot,如下所示:

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

  5. 所有这些都属于同一类 - 单一类。这些是做什么的:关闭游戏的活动窗口并创建一个新窗口。

    此代码在TicTacToe类中的显示方式:

    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单班的人。