我需要在单击按钮时重新启动我的应用程序,但我遇到了一些问题。我尝试了两种方法:
尝试this suggestion它确实重启了应用程序,但是每个小部件都出现Gtk_IS_INVISIBLE (widget)
错误,并且所有这些小部件在重新启动的应用程序中看起来都不一样,非常“旧”看起来(类似于TkInter小部件)。有没有办法解决这个错误?除此之外,应用程序运行正常。
我也尝试过:
subprocess.Popen("/home/pi/pywork/pyqt/of2.py")
sys.exit(0)
as suggested here,但我收到以下错误:OSError: [Errno 13] Permission denied
。有没有办法覆盖这个被拒绝的权限?
它们似乎都没有正常工作。有没有办法解决其中任何一个?您是否知道重新启动应用程序的替代方法?
答案 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_())