gpt4 book ai didi

python - PyQt 事件循环和 ipython 中的异常

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:28 28 4
gpt4 key购买 nike

我有一个显示一些小部件和按钮的 PyQt 程序。

我希望程序作为独立的 python 实例运行,或者在 ipython 环境中运行。在这种情况下,我在 Jupyter 控制台中使用了以下魔术命令(以前我在启动 ipython qtconsole 时必须使用 --gui=qt)

%pylab qt

为了让程序可以双向工作,我的主模块有以下几行:

APP = QtGui.Qapplication.instance() # retrieves the ipython qt application if any
if APP is None:
APP = QtGui.QApplication(["foo"]) # create one if standalone execution

if __name__=='__main__':
APP.exec_() # Launch the event loop here in standalone mode

这是我的问题:事件循环生成的异常很难被用户检测到,因为它们会在后台控制台中弹出。我想捕获事件循环中发生的任何异常,并显示警告(例如在 QMainWindow 状态栏中让用户知道发生了异常)。

我已经尝试了几种策略,但 PyQt 和 Ipython 的内部机制之间似乎存在一种阴谋,使这成为不可能:

这是一个困扰我很久的问题。有人有解决方案吗?

最佳答案

实际上,开发人员的回答为我指明了正确的方向:问题是每次执行一个 ipython 单元时,都会对一个新的 sys.excepthook 进行 monkeypatched,一旦执行完成,sys.excepthook 就会返回到前一个(参见 ipkernel/kernelapp.py)。

因此,在普通 ipython 单元指令中更改 sys.excepthook 不会更改在 qt 事件循环期间执行的 excepthook。

一个简单的解决方案是在 qt 事件中对 sys.excepthook 进行 monkeypatch:

from PyQt4 import QtCore, QtGui
import sys
from traceback import format_exception

def new_except_hook(etype, evalue, tb):
QtGui.QMessageBox.information(None,
str('error'),
''.join(format_exception(etype, evalue, tb)))

def patch_excepthook():
sys.excepthook = new_except_hook
TIMER = QtCore.QTimer()
TIMER.setSingleShot(True)
TIMER.timeout.connect(patch_excepthook)
TIMER.start()

此方法的一个优点是它适用于独立执行和 ipython 执行。

我想人们还可以想象通过在每个小部件的 event_handler 中调用 patch_excepthook 来根据触发异常的小部件来猴子修补不同版本的 new_except_hook。

关于python - PyQt 事件循环和 ipython 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40608610/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com