我有一个PyQt程序,显示一些小部件和按钮。
我希望该程序可以作为独立的Python实例运行,或者在ipython环境中运行。在这种情况下,我在Jupyter控制台中使用以下魔法命令(以前我必须在启动ipython qtconsole时使用--gui=qt)
为了拥有一个双向工作的程序,我的主模块有以下代码行:
这是我的问题:由事件循环引发的异常非常难以被用户检测到,因为它们会在后台控制台中弹出。我想捕获事件循环中发生的任何异常,并显示警告(例如在QMainWindow状态栏中),以使用户意识到发生了异常。
我尝试了几种策略,但似乎 PyQt 和 Ipython 的内部机制之间存在阴谋,使此操作不可能。
我希望该程序可以作为独立的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 的内部机制之间存在阴谋,使此操作不可能。
- 重新实现sys.excepthook(参见Preventing PyQt to silence exceptions occurring in slots):不起作用,因为ipython会覆盖sys.excepthook。
- 检测IPython是否正在运行,然后使用IPYTHON.set_custom_exc(Opening an IPython shell on any (uncatched) exception):不幸的是,qt事件循环异常不会触发处理程序。
- 覆盖QApplication.notify:不幸的是,我打算在派生函数中调用的本机QApplication.notify函数既不抛出异常,也不返回值(布尔值)反映插槽的正确执行。这个线程中的答案很有趣:How to log uncatched exceptions of a QApplication?,但是,似乎这种策略只在Qt c++中有效,而notify的python包装器只是将异常打印到控制台,而不是引发它们。
这是一个长期困扰我的问题。有人有解决方案吗?