2013-03-05 38 views
0

有没有我曾与PyQt4的和Python 2.6创建的应用程序中使用下面的代码重新启动PyQt的应用QApplication如何重新启动PyQt4的应用

的方式

app = QtGui.QApplication(sys.argv)

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

+2

就我个人而言,我只是写它,以便它可以重新加载设置,而无需重新启动。但是这样做:在你的'__main__'中,使它捕捉程序的退出原因。如果它是'RESTART'(或类似的东西),重新启动应用程序(这是在一个循环obv),否则退出? – TyrantWave 2013-03-05 10:27:17

回答

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的方法,甚至是一个功能,如果你不喜欢的子类

+0

这是行不通的,因为使用PyQt,QApplication.applicationFilePath()返回python解释器的路径。 – Jeannot 2013-03-05 11:25:08

+0

@Jeannot哦我不知道,我编辑了代码,以便它使用'os'模块 – 2013-03-05 11:33:00

+0

@Fabio Diniz,我将我的应用程序作为单个实例应用程序。所以我不能启动同一个应用程序的另一个实例。我想我不能使用这种方法。 – Rao 2013-03-05 13:00:59

2

我解释我是如何做的:

我CRE吃了额外的一个文件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_()) 

希望这是有帮助的! !

3

我有一个类似的问题,只是用这个在适当的地方:

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

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

0

这是我如何重启井字游戏PySide(它应该是相同的PyQt的):

我有一个单独的类 - 一个QWidget类 - 在被编码的井字游戏。重新启动应用程序使用:

  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)

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

此代码看起来在井字游戏类:

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