【问题标题】:Is there a way to call a function right before a PyQt application ends?有没有办法在 PyQt 应用程序结束之前调用函数?
【发布时间】:2011-04-19 11:21:36
【问题描述】:

我正在收集我的应用程序的使用统计信息,其中包括每个会话的持续时间。但是,我似乎无法保存此信息,因为我尝试过的所有信号都没有实际成功调用我的 report_session 函数。

这是我已经尝试过的信号:

  1. lastWindowClosed()
  2. aboutToQuit()
  3. 销毁()

要么这些信号永远不会发出,要么应用程序在此之后没有足够长的时间运行其他任何东西。这是我的主要内容:

app = QtGui.QApplication(sys.argv)

ui = MainWindow()
ui.app = app
QtCore.QObject.connect(ui, QtCore.SIGNAL("destroyed()"),  ui.report_session)
ui.show()
logger.info('Started!')
splash.finish(ui)

sys.exit(app.exec_())

【问题讨论】:

    标签: python user-interface pyqt pyqt4 signals-slots


    【解决方案1】:

    Mark Byers 发布的方法将在主窗口小部件关闭后运行,这意味着它的控件将不再可用。

    如果您需要使用表单控件中的任何值,您需要捕获关闭事件并在那里完成您的工作:

    class MainWidget(QtGui.QWidget):
    
        #...
    
        def closeEvent(self, event):
            print "closing PyQtTest"
            self.SaveSettings()
            # report_session()
    

    另外,请参阅 ZetCode 教程 First programs in PyQt4 toolkit 中的消息框示例(接近页面末尾)。这显示了如何接受或取消关闭请求。

    【讨论】:

      【解决方案2】:

      把代码放在app.exec_sys.exit之间:

      ret = app.exec_()
      # Your code that must run when the application closes goes here
      sys.exit(ret)
      

      【讨论】:

      • 你确定这有效吗?确实在我的机器上工作过
      【解决方案3】:

      为了确保在进程终止时调用 Python 函数,通常(无论是否涉及 Qt;-),您可以使用标准 Python 库的 atexit 模块:

      import atexit
      
      def whatever(): ...
      
      atexit.register(whatever)
      

      出于谨慎,我建议不要为此目的使用绑定方法而不是函数——它“应该”工作,但过程的破坏阶段总是有些微妙,而且你保持它越简单,更好。

      当然,

      atexit 不会触发进程足够严重的崩溃(例如,如果进程被 kill -9 杀死,那么 根据定义运行任何终止代码的机会)-操作系统会看到这一点;-)。如果您需要处理任何崩溃,无论您必须从单独的“看门狗”进程中处理多么困难,这是一个非常微妙的问题。

      【讨论】:

      • 我没有尝试过,虽然我知道 atexit 模块。我最终更喜欢重新实现 QApplication 的 closeEvent 方法。
      【解决方案4】:

      找到this answer,其中涉及重载closeEvent()。

      它非常适合我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 2014-05-02
        • 2017-07-13
        • 1970-01-01
        相关资源
        最近更新 更多