在PyQt应用程序结束之前是否有方法调用函数?

2024-05-21 00:46:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

  1. 上一个窗口已关闭()
  2. 关于退出()
  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_())

Tags: 函数信息app应用程序ui报表信号sys
3条回答

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

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

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

如果需要处理窗体上控件中的任何值,则需要捕获close事件并在其中执行操作:

class MainWidget(QtGui.QWidget):

    #...

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

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

为了确保在进程终止时调用Python函数,通常(包括或不包括Qt;-),可以使用标准Python库的atexit模块:

import atexit

def whatever(): ...

atexit.register(whatever)

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

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

相关问题 更多 >