如何重新启动 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?

如何在 C# 中重新启动任务?或如何重新启动 Thread.Sleep()?

统一单击重新启动按钮后如何显示广告然后重新启动场景?

描述用命令如何启动,停止,重新启动和查看www服务?

如何让IIS定时自动重新启动

如何在不重新启动树莓派本身的情况下重新启动 ALSA?