2009-05-01 29 views
18

Sto provando wxpython per la prima volta. Ho scritto una GUI per un programma python e quando lo eseguo, produce qualche errore nella GUI, ma la GUI scompare molto velocemente, abbastanza velocemente da non riuscire a leggere le informazioni sull'errore.Come eseguire il debug delle applicazioni wxpython?

C'è qualche registro che posso controllare per il messaggio di errore? (Utilizzo Mac OS X) o in altro modo?

Grazie in anticipo per qualsiasi aiuto.

Aggiornamento: Ecco il codice che mi sta dando il problema ...

#!/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() 

risposta

13

non sicuro circa la versione per Mac, ma wxPython è dotato di un modo per reindirizzare gli errori di una finestra (che, purtroppo, si chiudono quando i vostri arresti di applicazione, ma è utile per la cattura di errori che in silenzio non riescono) oppure a un registro file (aggiornato solo dopo la chiusura dell'applicazione):

app = wx.App(redirect=True) 
app = wx.App(redirect=True,filename="mylogfile.txt") 

questi funzioneranno indipendentemente da come si avvia l'applicazione. Vedere here per ulteriori

1

Avviare l'applicazione dalla riga di comando (credo che la sua chiamata 'Terminal' in OS X), come indicato di seguito, invece di un doppio clic sul file python. In questo modo quando l'applicazione si blocca vedrai la traccia dello stack.

pitone NameOfScript.py

In alternativa, è possibile reindirizzare l'output in un file di log:

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

beh, in realtà lo avvio dal terminale e ancora non viene emesso nulla: \ Proverò il suggerimento di reindirizzamento. – rogeriopvl

+0

Ho provato il reindirizzamento e il file di registro finisce vuoto: \ – rogeriopvl

0

aggiungere istruzioni di stampa per il vostro programma, in modo da poter dire come si comincia e dove finisce per morire (correndo dal terminale come hai già detto tu fai).

0

Si può anche eseguire il progetto da un IDE Python, come ad esempio Eric IDE. Ottieni il bonus aggiuntivo di poter tracciare, guardare le variabili e tonnellate di altre cose interessanti! :-)

8

Ecco un modo per segnalare l'errore nella GUI anziché nella console tramite un MessageDialog. È possibile utilizzare il metodo show_error() ovunque venga rilevata un'eccezione, ma è sufficiente che venga catturato al livello più alto. Puoi modificarlo in modo che l'applicazione continui a funzionare dopo che si è verificato l'errore, se l'errore può essere gestito.

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

Avvio da un IDE Python con un debugger.

Running in WingIDE individua immediatelly i due problemi:

  • ID_ABOUT dovrebbe essere wx.ID_ABOUT (linea # 4 di __init__).
  • OnAboutBox (l'intero metodo) è rientrato di un passo in più. Come scritto, è una funzione locale all'interno di __init__. Spostare l'intero metodo di un passo a sinistra per renderlo un metodo di MyApp.
0

Se si utilizza Spyder, premere F6, selezionare "Interagisci con l'interprete Python dopo l'esecuzione". La finestra non si chiude e puoi vedere il messaggio di errore.

Problemi correlati