2009-12-26 142 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塊中。