2009-12-26 145 views

回答

2

棒尝试节选无处不在您的应用程序可能会崩溃(I/O,网络等)。每当调用except以外,调用一个会杀死旧窗口的函数,产生一个新的tkinter通知窗口或带有错误消息的custom one

做一个root.after到新窗口并发送错误报告(urllib)。

如果您愿意,请重新启动按钮。

没有崩溃报告框架 - 因为tkinter不是那种类型的GUI。它几乎是简单的命令行应用程序的包装。

如果您想要在上面的屏幕截图中看到的功能,请转到pyqt/gtk或wxpython。但我很确定你去哪里,你必须写自己的记者。

+5

我不同意tkinter“几乎是简单的命令行应用程序的包装”的说法。 Tkinter是一个完整的GUI库,适合各种用途。事实上,Tkinter也可以用来实现截图中的所有功能。 – 2009-12-28 17:05:15

+0

我并不反对,但如果要用最少的努力制作一个完整的,可维护的GUI(带有崩溃报告和线程),可以使用上面列出的其他工具包之一。他们存在的原因是因为Tkinter没有充分满足这种需求。 – torger 2009-12-28 23:10:39

7

而不是污染你的代码到处都是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()将格式参数传递给except钩子,就像在Python的解释器中一样。

编辑:我忘了提及一个小问题。它不适用于线程(好吧,至少它没有上次我检查)。对于在另一个线程中运行的代码,您需要将其包装在try..except块中。