2013-03-05 167 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單班的人。