Как перезапустить приложение PyQt4

Есть ли способ перезапустить приложение PyQt QApplication

У меня есть приложение, созданное с помощью pyqt4 и python 2.6, используя приведенный ниже код.

app = QtGui.QApplication(sys.argv)

у меня есть параметры настройки, где я устанавливаю некоторые настройки. Теперь, когда я сохраняю настройки, мне нужно перезагрузить приложение, чтобы новые настройки вступили в силу. Без необходимости конечному пользователю выходить и снова запускать приложение.


person Rao    schedule 05.03.2013    source источник
comment
Лично я бы просто написал так, чтобы он мог перезагрузить настройки без перезагрузки. Но делаем это так: В вашем __main__ сделайте так, чтобы он перехватывал причину выхода из программы. Если это RESTART (или что-то в этом роде), перезапустите приложение (это циклично), иначе выйдите?   -  person TyrantWave    schedule 05.03.2013


Ответы (4)


У меня была аналогичная проблема, и я просто использовал это в соответствующем месте:

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

Это было простое приложение, и не требовалось никаких дополнительных аргументов.

person rchuso    schedule 03.09.2013

Я объясняю, как я это сделал:

Я создаю дополнительный файл main.py, который вызывает мой фактический основной файл программы dash.py. И я испускаю сигнал для перезапуска (мои программы автоматически обновляются при закрытии события), поэтому мне нужно было подавать сигнал для этого. Это фрагменты, надеюсь, это поможет вам.

Это в моем основном файле программы в 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_()) 

Надеюсь, это было полезно!!

person Mahendra    schedule 29.03.2013

РЕДАКТИРОВАТЬ: изменение способа получения пути к приложению

Вы можете просто запустить новый процесс и выйти из своего, примерно так: (КОД НЕ ПРОВЕРЕН, но основан на этот ответ)

// 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);

Закодируйте его как метод вашего Q-приложения или даже как функцию, если вам не хочется создавать подклассы.

person Fábio Diniz    schedule 05.03.2013
comment
Это не сработает, поскольку с PyQt QApplication.applicationFilePath() возвращает путь к интерпретатору python. - person Jeannot; 05.03.2013
comment
@Jeannot О, я этого не знал, я отредактировал код, чтобы он использовал модуль os - person Fábio Diniz; 05.03.2013
comment
@Fabio Diniz, я сделал свое приложение как приложение с одним экземпляром. Поэтому я не могу запустить другой экземпляр того же приложения. Я думаю, что не могу использовать этот подход. - person Rao; 05.03.2013

Вот как я перезапускаю игру TicTacToe в PySide (то же самое должно быть и в PyQt):

У меня есть один класс — QWidget — в котором закодирована игра Крестики-нолики. Чтобы перезапустить приложение, я использую:

  1. import subprocess

  2. QPushButton() вот так:

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

  3. подключение button к Slot:

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

  4. Slot для этой кнопки, вот так:

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

Все они находятся в одном и том же - единственном - классе. А что делают эти: закрывают активное окно игры и создают новое.

Как этот код выглядит в классе 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 одиночный класс.

person doru    schedule 17.07.2014