I thought this might be useful to someone else.  I made this
sys.excepthook function that displays a nice dialog for uncaught
exceptions.
  To use, just import the module, that's all.  The license is whatever
you want.

-- 
Gustavo J. A. M. Carneiro
<[EMAIL PROTECTED]> <[EMAIL PROTECTED]>
import sys
import gtk, pango
from gettext import gettext as _
from cStringIO import *
import traceback

def _info(type, value, tb):
    dialog = gtk.MessageDialog(parent=None,
			       flags=0,
			       type=gtk.MESSAGE_WARNING,
			       buttons=gtk.BUTTONS_NONE,
			       message_format=_(
	"<big><b>A programming error has been detected during the execution of this program.</b></big>"
	"\n\nIt probably isn't fatal, but should be reported to the developers nonetheless."))
    dialog.set_title(_("Bug Detected"))
    dialog.set_property("has-separator", False)
    dialog.vbox.get_children()[0].get_children()[1].set_property("use-markup", True)

    dialog.add_button(_("Details..."), 1)
    dialog.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
    
    while 1:
	resp = dialog.run()
	if resp == 1:
	    # Show details...
	    details = gtk.Dialog(_("Bug Details"), dialog,
				 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
				 (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE,))

	    textview = gtk.TextView(); textview.show()
	    textview.set_editable(False)
	    textview.modify_font(pango.FontDescription("Monospace"))
	    
	    sw = gtk.ScrolledWindow(); sw.show()
	    sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
	    sw.add(textview)
	    details.vbox.add(sw)
	    textbuffer = textview.get_buffer()
	    trace = StringIO()
	    traceback.print_exception(type, value, tb, None, trace)
	    textbuffer.set_text(trace.getvalue())
	    details.set_default_size(gtk.gdk.screen_width()/2, gtk.gdk.screen_height()/3)
	    details.run()
	    details.destroy()
	else: break
    dialog.destroy()
    

sys.excepthook = _info


_______________________________________________
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to