2009-05-01 12 views
18

Ich versuche wxpython zum ersten Mal. Ich habe eine GUI für ein Python-Programm geschrieben und wenn ich es ausführe, erzeugt es einige Fehler in der GUI, aber die GUI verschwindet sehr schnell, schnell genug, dass ich die Fehlerinformationen nicht lesen kann.Wie Debuggen von Wxpython-Anwendungen?

Gibt es ein Protokoll, das ich für die Fehlermeldung überprüfen kann? (Ich betreibe Mac OS X) oder auf andere Weise?

Vielen Dank im Voraus für jede Hilfe.

Update: Hier ist der Code, der mir das Problem ist zu geben ...

#!/usr/bin/python 

import wx 

class MyApp (wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, size=(390, 350)) 
    menubar = wx.MenuBar() 
    help = wx.Menu() 
    help.Append(ID_ABOUT, '&About') 
    self.Bind(wx.EVT_MENU, self.OnAboutBox, id=wx.ID_ABOUT) 
    menubar.Append(help, '&Help') 
    self.SetMenuBar(menubar) 

    self.Centre() 
    self.Show(True) 

    panel = wx.Panel(self, -1) 

    font = wx.SystemSettings_GetFont(wx.SYS_SYSTEM_FONT) 
    font.SetPointSize(9) 

    vbox = wx.BoxSizer(wx.VERTICAL) 

    hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
    st1 = wx.StaticText(panel, -1, 'Class Name') 
    st1.SetFont(font) 
    hbox1.Add(st1, 0, wx.RIGHT, 8) 
    tc = wx.TextCtrl(panel, -1) 
    hbox1.Add(tc, 1) 
    vbox.Add(hbox1, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, 10) 

    vbox.Add((-1, 10)) 

    hbox2 = wx.BoxSizer(wx.HORIZONTAL) 
    st2 = wx.StaticText(panel, -1, 'Matching Classes') 
    st2.SetFont(font) 
    hbox2.Add(st2, 0) 
    vbox.Add(hbox2, 0, wx.LEFT | wx.TOP, 10) 

    vbox.Add((-1, 10)) 

    hbox3 = wx.BoxSizer(wx.HORIZONTAL) 
    tc2 = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE) 
    hbox3.Add(tc2, 1, wx.EXPAND) 
    vbox.Add(hbox3, 1, wx.LEFT | wx.RIGHT | wx.EXPAND, 10) 

    vbox.Add((-1, 25)) 

    hbox4 = wx.BoxSizer(wx.HORIZONTAL) 
    cb1 = wx.CheckBox(panel, -1, 'Case Sensitive') 
    cb1.SetFont(font) 
    hbox4.Add(cb1) 
    cb2 = wx.CheckBox(panel, -1, 'Nested Classes') 
    cb2.SetFont(font) 
    hbox4.Add(cb2, 0, wx.LEFT, 10) 
    cb3 = wx.CheckBox(panel, -1, 'Non-Project classes') 
    cb3.SetFont(font) 
    hbox4.Add(cb3, 0, wx.LEFT, 10) 
    vbox.Add(hbox4, 0, wx.LEFT, 10) 

    vbox.Add((-1, 25)) 

    hbox5 = wx.BoxSizer(wx.HORIZONTAL) 
    btn1 = wx.Button(panel, -1, 'Ok', size=(70, 30)) 
    hbox5.Add(btn1, 0) 
    btn2 = wx.Button(panel, -1, 'Close', size=(70, 30)) 
    hbox5.Add(btn2, 0, wx.LEFT | wx.BOTTOM , 5) 
    vbox.Add(hbox5, 0, wx.ALIGN_RIGHT | wx.RIGHT, 10) 

    panel.SetSizer(vbox) 
    self.Centre() 
    self.Show(True) 

    def OnAboutBox(self, event): 
     description = """ describe my app here """ 

     licence = """ blablabla """ 


     info = wx.AboutDialogInfo() 

     info.SetIcon(wx.Icon('icons/icon.png', wx.BITMAP_TYPE_PNG)) 
     info.SetName('') 
     info.SetVersion('1.0') 
     info.SetDescription(description) 
     info.SetCopyright('') 
     info.SetWebSite('') 
     info.SetLicence(licence) 
     info.AddDeveloper('') 
     info.AddDocWriter('') 
     info.AddArtist('') 
     info.AddTranslator('') 

     wx.AboutBox(info) 

app = wx.App() 
MyApp (None, -1, 'Go To Class') 
app.MainLoop() 

Antwort

13

über die Mac-Version nicht sicher, aber WxPython ein in Art und Weise Fehler auf ein Fenster gebaut zu umleiten (was leider schließen, wenn die Anwendung abstürzt, aber es ist nützlich für Fehler zu kontrollieren, die unbemerkt fehlschlagen) oder in ein Protokoll Datei (wird nur nach dem Schließen Ihrer Anwendung aktualisiert):

Diese funktionieren unabhängig davon, wie Sie Ihre Anwendung starten. Siehe here für mehr

1

Starten Sie die Anwendung von der Kommandozeile (ich glaube, seine genannte ‚Terminal‘ in OS X), wie unten statt Doppelklick darauf hingewiesen, auf der Python-Datei. Auf diese Weise sehen Sie, wenn die Anwendung abstürzt, den Stack-Trace.

Python NameOfScript.py

Alternativ können Sie die Ausgabe in eine Protokolldatei umleiten:

f=open('app.log','w') 
import sys 
sys.stdout=f 
sys.stderr=f 
+0

Nun, eigentlich starte ich es vom Terminal und es wird immernoch nichts ausgegeben: \ Ich versuche den Umleitungstipp. – rogeriopvl

+0

Ich habe versucht, die Umleitung und die Protokolldatei endet leer: \ – rogeriopvl

0

hinzufügen print-Anweisungen zu Ihrem Programm, so können Sie sagen, wie es beginnt und wo es endet zu sterben (indem Sie aus dem Terminal laufen, wie Sie schon sagten, tun Sie).

0

Sie können Ihr Projekt auch über eine Python-IDE ausführen, z. B. Eric IDE. Sie erhalten den zusätzlichen Bonus, dass Sie in der Lage sind, Variablen und Tonnen von anderen coolen Sachen zu verfolgen! :-)

8

Hier ist eine Möglichkeit, den Fehler in der GUI statt der Konsole über einen MessageDialog gemeldet werden. Sie können die show_error() -Methode überall dort verwenden, wo eine Ausnahme abgefangen wird, hier wird sie nur auf der obersten Ebene abgefangen. Sie können dies ändern, damit die App nach dem Auftreten des Fehlers weiterläuft, wenn der Fehler behoben werden kann.

import wx 
import sys 
import traceback 

def show_error(): 
    message = ''.join(traceback.format_exception(*sys.exc_info())) 
    dialog = wx.MessageDialog(None, message, 'Error!', wx.OK|wx.ICON_ERROR) 
    dialog.ShowModal() 

class Frame(wx.Frame): 
    def __init__(self): 
     super(Frame, self).__init__(None, -1, 'My Frame') 
    def cause_error(self): 
     raise Exception, 'This is a test.' 

def main(): 
    app = wx.PySimpleApp() 
    try: 
     frame = Frame() 
     frame.Show() 
     frame.cause_error() 
     app.MainLoop() 
    except: 
     show_error() 

if __name__ == '__main__': 
    main() 
2

Starten von einer Python-IDE mit einem Debugger.

Laufen in WingIDE lokalisiert immediatelly die beiden Probleme:

  • ID_ABOUTwx.ID_ABOUT sein sollte (Zeile # 4 von __init__).
  • OnAboutBox (die gesamte Methode) ist einen Schritt zu viel eingerückt. Wie geschrieben, ist es eine lokale Funktion innerhalb __init__. Verschieben Sie die gesamte Methode einen Schritt nach links, um eine Methode von MyApp zu erstellen.
0

Wenn Sie Spyder verwenden, drücken Sie F6, überprüfen Sie "interagieren mit dem Python-Interpreter nach der Ausführung". Das Fenster wird nicht geschlossen, und Sie können die Fehlermeldung sehen.