2009-12-26 2 views
6

Есть ли crash reporting каркас, который может использоваться для pure Python Tkinter applications? В идеале, он должен работать кросс-платформенно.Отчет о сбоях в Python

Практически говоря, это скорее «отчет об исключении», так как сам интерпретатор Python почти не сработает.

Вот пример аварии репортер:

alt text

ответ

2

Придерживайтесь попробовать excepts везде приложение может привести к сбою (I/O, сетевые и т.д.). Всякий раз, когда вызывается исключение, вызовите функцию, которая убьет старое окно, откроет новое окно уведомлений tkinter или custom one с вашим сообщением об ошибке.

Сделайте root.after в новом окне и отправьте отчет об ошибке (urllib).

Поставьте кнопку перезагрузки, если хотите.

Нет рамок для создания отчетов о сбоях - поскольку tkinter - это не тот тип графического интерфейса. Это довольно обертка для простых приложений в командной строке.

Пойдите pyqt/gtk или wxpython, если вы хотите, чтобы функции были видны на экране выше. Но я уверен, что куда бы вы ни отправились, вам придется написать своего репортера.

+5

Я не согласен с утверждением, что tkinter - это «довольно обертка для простых приложений в командной строке». Tkinter - полноценная библиотека графического интерфейса, подходящая для всех целей. Фактически, Tkinter также может использоваться для реализации всех функций на скриншоте. –

+0

Я не согласен, но если кто-то должен сделать полноценный, поддерживаемый GUI (с отчетами о сбоях и потоками), с наименьшим усилием, можно использовать один из других наборов инструментов, перечисленных выше. Причина, по которой они существуют, заключается в том, что Tkinter не удовлетворяет эту потребность адекватно. – torger

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() будет форматировать аргумент, переданный в исключение, таким же образом, как и в интерпретаторе Python.

EDIT: Я забыл упомянуть немного о том, что это произошло. Он не работает с потоками (ну, по крайней мере, это не последний раз, когда я проверил). Для кода, запущенного в другом потоке, вам необходимо обернуть его в блок try..except.