Python 如何重新启动PyQt4应用程序

Python 如何重新启动PyQt4应用程序,python,pyqt4,application-restart,Python,Pyqt4,Application Restart,有没有办法重新启动PyQt应用程序QApplication 我有一个使用pyqt4和Python2.6创建的应用程序,使用下面的代码 app=QtGui.QApplication(sys.argv) 我有设置选项,可以在其中设置一些设置。现在,当我保存设置时,我需要重新加载应用程序,以便新设置生效。无需最终用户退出并再次启动应用程序。编辑:更改获取应用程序路径的方式 您可以启动一个新流程并退出您的流程,类似这样:(代码未经测试,但基于) 将其编码为Qapplication的一种方法,甚至是一个函

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

我有一个使用pyqt4和Python2.6创建的应用程序,使用下面的代码

app=QtGui.QApplication(sys.argv)


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

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

您可以启动一个新流程并退出您的流程,类似这样:(代码未经测试,但基于)


将其编码为Qapplication的一种方法,甚至是一个函数(如果您不想子类化)

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

您可以启动一个新流程并退出您的流程,类似这样:(代码未经测试,但基于)


将其编码为Qapplication的一种方法,甚至是一个函数(如果您不想子类化)

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

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

希望这是有帮助的

我解释我是如何做到的:

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

希望这是有帮助的

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

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

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

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

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

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

这就是我如何在PySide中重新启动TictaToe游戏(在PyQt中应该是相同的):

我有一个单独的类-a
QWidget
class-其中编码的是tictac-Toe游戏。要重新启动我使用的应用程序,请执行以下操作:

  • 导入子流程

  • 像这样的
    QPushButton()

    self.button=QPushButton(“重启”,self)

  • 按钮
    插槽
    的连接:

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

  • 此按钮的
    插槽
    ,如下所示:

    def重启游戏(self):
    self.close()
    subprocess.call(“python”+“TicTAcToe.py”,shell=True)

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

    此代码在TictaToe类中的外观:

    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
    单个类的人

    这就是我如何在PySide中重新启动TictaToe游戏(在PyQt中应该是相同的):

    我有一个单独的类-a
    QWidget
    class-其中编码的是tictac-Toe游戏。要重新启动我使用的应用程序,请执行以下操作:

  • 导入子流程

  • 像这样的
    QPushButton()

    self.button=QPushButton(“重启”,self)

  • 按钮
    插槽
    的连接:

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

  • 此按钮的
    插槽
    ,如下所示:

    def重启游戏(self):
    self.close()
    subprocess.call(“python”+“TicTAcToe.py”,shell=True)

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

    此代码在TictaToe类中的外观:

    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
    单个类的人

    就我个人而言,我只是编写它,这样它就可以在不需要重新启动的情况下重新加载设置。但是这样做:在您的
    \uuuu main\uuuu
    中,使其捕获程序的退出原因。如果是
    重新启动
    (或类似的内容),请重新启动应用程序(这是一个循环obv),否则退出?就我个人而言,我只需编写它,这样它就可以在不需要重新启动的情况下重新加载设置。但是这样做:在您的
    \uuuu main\uuuu
    中,使其捕获程序的退出原因。如果是
    重新启动
    (或类似操作),请重新启动应用程序(这是一个循环obv),否则退出?这将不起作用,因为使用PyQt时,QApplication.applicationFilePath()将返回python解释器的路径。@Jeannot哦,我不知道,我编辑了代码,使其使用
    操作系统
    module@Fabio迪尼兹,我把我的应用程序作为一个单实例应用程序。因此,我无法启动同一应用程序的另一个实例。我想我不能使用这种方法。这不起作用,因为在PyQt中,QApplication.applicationFilePath()返回python解释器的路径。@Jeannot哦,我不知道,我编辑了代码,以便它使用
    os
    module@FabioDiniz,我将我的应用程序作为一个单实例应用程序。因此,我无法启动同一应用程序的另一个实例。我想我不能用这种方法。