如何重新启动QApplication

时间:2016-03-19 19:18:59

标签: python pyqt restart qapplication

我需要在单击按钮时重新启动我的应用程序,但我遇到了一些问题。我尝试了两种方法:

  1. 尝试this suggestion它确实重启了应用程序,但是每个小部件都出现Gtk_IS_INVISIBLE (widget)错误,并且所有这些小部件在重新启动的应用程序中看起来都不一样,非常“旧”看起来(类似于TkInter小部件)。有没有办法解决这个错误?除此之外,应用程序运行正常。

  2. 我也尝试过:

    subprocess.Popen("/home/pi/pywork/pyqt/of2.py")
    sys.exit(0)
    

    as suggested here,但我收到以下错误:OSError: [Errno 13] Permission denied。有没有办法覆盖这个被拒绝的权限?

  3. 它们似乎都没有正常工作。有没有办法解决其中任何一个?您是否知道重新启动应用程序的替代方法?

2 个答案:

答案 0 :(得分:1)

您可以使用QProcess.startDetached

#!/usr/bin/env python

您还必须正确地将shebang添加到您的python脚本中:

<?xml version='1.0' encoding='UTF-8'?>
<hudson>
   <disabledAdministrativeMonitors/>
   <version>1.653</version>
   <numExecutors>2</numExecutors>
   <mode>NORMAL</mode>
   <useSecurity>true</useSecurity>
   .................
   .................

答案 1 :(得分:1)

第二种方法出错,因为该文件不可执行。你可以修复它,但是使用相同的python可执行文件重新运行脚本可能更强大。避免对脚本路径进行硬编码也是一个好主意。

这是一个简单的演示脚本,它实现了所有这些:

import sys, os, subprocess
from PyQt4 import QtCore, QtGui

FILEPATH = os.path.abspath(__file__)

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.button = QtGui.QPushButton(
            'Restart [PID: %d]' % QtGui.qApp.applicationPid(), self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.button)

    def handleButton(self):
        try:
            subprocess.Popen([sys.executable, FILEPATH])
        except OSError as exception:
            print('ERROR: could not restart aplication:')
            print('  %s' % str(exception))
        else:
            QtGui.qApp.quit()

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 400, 100, 50)
    window.show()
    sys.exit(app.exec_())