<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/0.11.1">
</HEAD>
<BODY>Try this:<br>
<br>
#!/usr/bin/env python<br>
<br>
import sys<br>
from qt import *<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
class PyQMainWindow( QMainWindow ):<br>
 &nbsp;&nbsp;&nbsp;def __init__( self, parent = None, name = None, fl = 0 ):<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QMainWindow.__init__( self, parent, name, fl )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setCaption( self.tr ('Traceback Test') )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonGroup = QButtonGroup( self.tr ('Traceback Test'), self, 'group' )<br>
<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global multiLineEdit<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multiLineEdit = QMultiLineEdit( buttonGroup, 'edit' )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multiLineEdit.insertLine ( &quot;In PyQApplication.exec_loop()...&quot; )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;badButton = QPushButton( self.tr ('&amp;Error'), buttonGroup, 'bad' )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quitButton = QPushButton( self.tr ('&amp;Quit'), buttonGroup, 'quit' )<br>
<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBoxLayout = QVBoxLayout( buttonGroup )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBoxLayout.addWidget( multiLineEdit )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBoxLayout.addWidget( badButton )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vBoxLayout.addWidget( quitButton )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.connect( badButton, SIGNAL ('clicked()'), badFunc )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.connect( quitButton, SIGNAL ('clicked()'), self, SLOT ('close()') )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setCentralWidget( buttonGroup )<br>
<br>
def badFunc():<br>
 &nbsp;&nbsp;&nbsp;try:<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert bob, 'NameError'<br>
 &nbsp;&nbsp;&nbsp;except NameError, args:<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines = '%s: %s' % ( args.__class__.__name__, args )<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multiLineEdit.insertLine( lines )<br>
<br>
def main( *args ):<br>
 &nbsp;&nbsp;&nbsp;app = QApplication( *args )<br>
 &nbsp;&nbsp;&nbsp;win = PyQMainWindow( None, 'main', Qt.WDestructiveClose )<br>
 &nbsp;&nbsp;&nbsp;win.resize( 300, 50 )<br>
 &nbsp;&nbsp;&nbsp;app.setMainWidget( win )<br>
 &nbsp;&nbsp;&nbsp;win.show()<br>
 &nbsp;&nbsp;&nbsp;app.connect( app, SIGNAL ('lastWindowClosed()'),<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app, SLOT ('quit()') )<br>
 &nbsp;&nbsp;&nbsp;app.exec_loop()<br>
<br>
if __name__ == &quot;__main__&quot;:<br>
 &nbsp;&nbsp;&nbsp;main( sys.argv )<br>
<pre>-- 
Curtis Taylor
SupplySolution, Inc.
911 Olive Street
Santa Barbara CA 93101
805.879.7264

PGP Fingerprint: 5A61 444C 71C2 8EAE 7268  A78A F41F A503 00A5 234D</pre>On 06 Sep 2001 12:00:04 +0200, pykde-admin@mats.gmd.de wrote:<pre><FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; Send PyKDE mailing list submissions to</FONT>
<FONT COLOR="#737373">&gt;         pykde@mats.gmd.de</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; To subscribe or unsubscribe via the web, visit</FONT>
<FONT COLOR="#737373">&gt;         http://mats.gmd.de/mailman/listinfo/pykde</FONT>
<FONT COLOR="#737373">&gt; or, via email, send a message with subject or body 'help' to</FONT>
<FONT COLOR="#737373">&gt;         pykde-request@mats.gmd.de</FONT>
<FONT COLOR="#737373">&gt; You can reach the person managing the list at</FONT>
<FONT COLOR="#737373">&gt;         pykde-admin@mats.gmd.de</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; When replying, please edit your Subject line so it is more specific than</FONT>
<FONT COLOR="#737373">&gt; &quot;Re: Contents of PyKDE digest...&quot;</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; Today's Topics:</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt;   1. How to capture python tracebacks? (Dave Smith)</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; --__--__--</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; Message: 1</FONT>
<FONT COLOR="#737373">&gt; Date: Wed, 05 Sep 2001 17:31:43 -0400</FONT>
<FONT COLOR="#737373">&gt; From: Dave Smith &lt;Dave.Smith@transcendata.com&gt;</FONT>
<FONT COLOR="#737373">&gt; Organization: TranscenData -- an ITI Business</FONT>
<FONT COLOR="#737373">&gt; To: PyQt/KDE Mailing List &lt;pykde@mats.gmd.de&gt;</FONT>
<FONT COLOR="#737373">&gt; boundary=&quot;------------9D4B0167909B3E56AFB44BFD&quot;</FONT>
<FONT COLOR="#737373">&gt; Subject: [PyKDE] How to capture python tracebacks?</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; This is a multi-part message in MIME format.</FONT>
<FONT COLOR="#737373">&gt; --------------9D4B0167909B3E56AFB44BFD</FONT>
<FONT COLOR="#737373">&gt; Content-Type: text/plain; charset=us-ascii</FONT>
<FONT COLOR="#737373">&gt; Content-Transfer-Encoding: 7bit</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; Hello all,</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; I'm trying to figure out a way to capture python traceback</FONT>
<FONT COLOR="#737373">&gt; messages that are apparently caught in the pyqt event loop</FONT>
<FONT COLOR="#737373">&gt; and issued to stdout.</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; For example, in the attached sample program, I would like</FONT>
<FONT COLOR="#737373">&gt; the tracebacks that occur when the 'Error' button is clicked</FONT>
<FONT COLOR="#737373">&gt; to be displayed in the multi line edit as well as stdout.</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; I thought about implementing the event loop in my PyQApplication</FONT>
<FONT COLOR="#737373">&gt; sub-class but could not find enough info to do it.  Has anyone</FONT>
<FONT COLOR="#737373">&gt; else done this?</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; Any other ideas?</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; Best regards,</FONT>
<FONT COLOR="#737373">&gt; Dave</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; --------------9D4B0167909B3E56AFB44BFD</FONT>
<FONT COLOR="#737373">&gt; Content-Type: text/plain; charset=us-ascii;</FONT>
<FONT COLOR="#737373">&gt;  name=&quot;qtexc.py&quot;</FONT>
<FONT COLOR="#737373">&gt; Content-Transfer-Encoding: 7bit</FONT>
<FONT COLOR="#737373">&gt; Content-Disposition: inline;</FONT>
<FONT COLOR="#737373">&gt;  filename=&quot;qtexc.py&quot;</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; #!/usr/bin/env python</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; import os</FONT>
<FONT COLOR="#737373">&gt; import sys</FONT>
<FONT COLOR="#737373">&gt; import string</FONT>
<FONT COLOR="#737373">&gt; import traceback</FONT>
<FONT COLOR="#737373">&gt; from qt import *</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; class PyQApplication (QApplication):</FONT>
<FONT COLOR="#737373">&gt;    def __init__ (self, argv):</FONT>
<FONT COLOR="#737373">&gt;       QApplication.__init__ (self, argv)</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt;    def exec_loop (self):</FONT>
<FONT COLOR="#737373">&gt;       global multiLineEdit</FONT>
<FONT COLOR="#737373">&gt;       multiLineEdit.insertLine (&quot;In PyQApplication.exec_loop()...&quot;)</FONT>
<FONT COLOR="#737373">&gt;       QApplication.exec_loop (self)</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; class PyQMainWindow (QMainWindow):</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt;    def __init__ (self, parent = None, name = None, fl = 0):</FONT>
<FONT COLOR="#737373">&gt;       QMainWindow.__init__ (self, parent, name, fl)</FONT>
<FONT COLOR="#737373">&gt;       self.setCaption (self.tr ('Traceback Test'))</FONT>
<FONT COLOR="#737373">&gt;       buttonGroup = QButtonGroup (self.tr ('Traceback Test'), self, 'group')</FONT>
<FONT COLOR="#737373">&gt;       vBoxLayout = QVBoxLayout (buttonGroup)</FONT>
<FONT COLOR="#737373">&gt;       global multiLineEdit</FONT>
<FONT COLOR="#737373">&gt;       multiLineEdit = QMultiLineEdit (buttonGroup, 'edit')</FONT>
<FONT COLOR="#737373">&gt;       vBoxLayout.addWidget (multiLineEdit)</FONT>
<FONT COLOR="#737373">&gt;       badButton = QPushButton (self.tr ('&amp;Error'), buttonGroup, 'bad')</FONT>
<FONT COLOR="#737373">&gt;       vBoxLayout.addWidget (badButton)</FONT>
<FONT COLOR="#737373">&gt;       self.connect (badButton, SIGNAL ('clicked()'), badFunc)</FONT>
<FONT COLOR="#737373">&gt;       quitButton = QPushButton (self.tr ('&amp;Quit'), buttonGroup, 'quit')</FONT>
<FONT COLOR="#737373">&gt;       vBoxLayout.addWidget (quitButton)</FONT>
<FONT COLOR="#737373">&gt;       self.connect (quitButton, SIGNAL ('clicked()'), self, SLOT ('close()'))</FONT>
<FONT COLOR="#737373">&gt;       self.setCentralWidget (buttonGroup)</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; def getTraceback():</FONT>
<FONT COLOR="#737373">&gt;    lines = traceback.format_exception (sys.exc_type, sys.exc_value,</FONT>
<FONT COLOR="#737373">&gt;       sys.exc_traceback)</FONT>
<FONT COLOR="#737373">&gt;    return string.join (lines, '')</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; def badFunc():</FONT>
<FONT COLOR="#737373">&gt;    RaiseNameError </FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; def main():</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt;    try:</FONT>
<FONT COLOR="#737373">&gt;       badFunc()</FONT>
<FONT COLOR="#737373">&gt;    except:</FONT>
<FONT COLOR="#737373">&gt;       print '-'*77</FONT>
<FONT COLOR="#737373">&gt;       print getTraceback()</FONT>
<FONT COLOR="#737373">&gt;       print '-'*77</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt;    appTopLevel = PyQApplication (sys.argv)</FONT>
<FONT COLOR="#737373">&gt;    appMainWin = PyQMainWindow (None, 'main', Qt.WDestructiveClose)</FONT>
<FONT COLOR="#737373">&gt;    appMainWin.show()</FONT>
<FONT COLOR="#737373">&gt;    appTopLevel.connect (appTopLevel, SIGNAL ('lastWindowClosed()'),</FONT>
<FONT COLOR="#737373">&gt;       appTopLevel, SLOT ('quit()'))</FONT>
<FONT COLOR="#737373">&gt;    appTopLevel.exec_loop()</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; if __name__ == &quot;__main__&quot; : main()</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; --------------9D4B0167909B3E56AFB44BFD--</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; --__--__--</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; _______________________________________________</FONT>
<FONT COLOR="#737373">&gt; PyKDE mailing list</FONT>
<FONT COLOR="#737373">&gt; PyKDE@mats.gmd.de</FONT>
<FONT COLOR="#737373">&gt; http://mats.gmd.de/mailman/listinfo/pykde</FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; </FONT>
<FONT COLOR="#737373">&gt; End of PyKDE Digest</FONT></pre><TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="100%">
<TR>
<TD>
<pre></pre></TD>
</TR>
</TABLE>
</BODY>
</HTML>