【问题标题】:How to restart an QApplication如何重新启动 QApplication
【发布时间】:2016-03-19 19:18:59
【问题描述】:

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

  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。有没有办法覆盖这个被拒绝的权限?

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

【问题讨论】:

  • 请澄清您所说的“重启”是什么意思,因为您给出的两个示例非常不同。你真的需要创建一个完全新的进程吗?或者您只需要在 当前 进程中创建一个新的应用程序对象和主窗口?或者您需要做的只是创建一个新的主窗口,但使用相同的应用程序对象?您正在尝试解决什么实际问题?
  • 我想关闭当前进程并开始一个新进程。我通过在应用程序上设置样式解决了第一个建议的小部件错误,因此通过放置setStyle("GTK+"),小部件错误消失了。

标签: python pyqt restart qapplication


【解决方案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_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多