如何重新启动 QApplication
Posted
技术标签:
【中文标题】如何重新启动 QApplication【英文标题】:How to restart an QApplication 【发布时间】:2016-03-19 19:18:59 【问题描述】:单击按钮时我需要重新启动我的应用程序,但我遇到了一些问题。我试过两种方法:
试过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
。有没有办法覆盖这个被拒绝的权限?
它们似乎都不能正常工作。有没有办法修复它们中的任何一个?你知道另一种重启应用程序的方法吗?
【问题讨论】:
请澄清您所说的“重启”是什么意思,因为您给出的两个示例非常不同。你真的需要创建一个完全新的进程吗?或者您只需要在 当前 进程中创建一个新的应用程序对象和主窗口?或者您需要做的只是创建一个新的主窗口,但使用相同的应用程序对象?您正在尝试解决什么实际问题? 我想关闭当前进程并开始一个新进程。我通过在应用程序上设置样式解决了第一个建议的小部件错误,因此通过放置setStyle("GTK+")
,小部件错误消失了。
【参考方案1】:
你可以使用QProcess.startDetached:
QProcess.startDetached("/home/pi/pywork/pyqt/of2.py")
sys.exit(0)
您还必须将shebang 正确添加到您的python 脚本中:
#!/usr/bin/env python
【讨论】:
【参考方案2】:第二种方法会出错,因为文件不可执行。你可以解决这个问题,但使用相同的 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_())
【讨论】:
以上是关于如何重新启动 QApplication的主要内容,如果未能解决你的问题,请参考以下文章
如果我们重新启动 postgres,如何重新启动后台工作人员 postgresql?