2

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

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

  2. 我也试过:

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

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

它们似乎都不能正常工作。有没有办法修复它们中的任何一个?您知道重新启动应用程序的替代方法吗?

4

2 回答 2

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_())
于 2016-03-20T18:52:14.540 回答
1

您可以使用QProcess.startDetached

QProcess.startDetached("/home/pi/pywork/pyqt/of2.py")
sys.exit(0)

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

#!/usr/bin/env python
于 2016-03-20T17:14:05.490 回答