【发布时间】:2023-04-06 11:39:01
【问题描述】:
是否有可用于pure Python Tkinter applications 的crash reporting 框架?理想情况下,它应该可以跨平台工作。
实际上,这更像是“异常报告”,因为 Python 解释器本身几乎不会崩溃。
这是一个示例崩溃报告器:
【问题讨论】:
标签: python tkinter crash-reports
是否有可用于pure Python Tkinter applications 的crash reporting 框架?理想情况下,它应该可以跨平台工作。
实际上,这更像是“异常报告”,因为 Python 解释器本身几乎不会崩溃。
这是一个示例崩溃报告器:
【问题讨论】:
标签: python tkinter crash-reports
与其到处用try..except 污染你的代码,你应该通过设置sys.excepthook 来实现你自己的除了钩子。这是一个例子:
import sys
import traceback
def install_excepthook():
def my_excepthook(exctype, value, tb):
s = ''.join(traceback.format_exception(exctype, value, tb))
dialog = ErrorReportDialog(None, s)
dialog.exec_()
sys.excepthook = my_excepthook
在您的应用程序启动时调用install_exception()。
ErrorReportDialog 是我制作的 Qt 对话框。 traceback.format_exception() 将像在 Python 的解释器中一样格式化传递给 except 钩子的参数。
编辑:我忘了提到一个小问题。它不适用于线程(好吧,至少我上次检查时没有这样做)。对于在另一个线程中运行的代码,您需要将其包装在 try..except 块中。
【讨论】:
在您的应用程序可能崩溃的任何地方(I/O、网络等)都坚持尝试。每当调用 except 时,调用将杀死旧窗口的函数,生成新的 tkinter 通知窗口,或带有错误消息的 custom one。
对新窗口执行 root.after 并发送错误报告 (urllib)。
如果你愿意,可以放一个重启按钮。
没有崩溃报告框架——因为 tkinter 不是那种类型的 GUI。它几乎是简单命令行应用程序的包装器。
如果您想要上面屏幕截图中的功能,请使用 pyqt/gtk 或 wxpython。但我很确定,无论你走到哪里,你都必须自己写记者。
【讨论】: