2009-05-01 13 views
18

Estoy probando wxpython por primera vez. He escrito una GUI para un programa de Python y cuando lo ejecuto, produce algún error en la GUI, pero la GUI desaparece muy rápido, lo suficientemente rápido como para que no pueda leer la información de error.¿Cómo depurar las aplicaciones wxpython?

¿Hay algún registro que pueda verificar el mensaje de error? (Estoy ejecutando Mac OS X) o de otra manera?

Gracias de antemano por cualquier ayuda.

Actualización: Aquí está el código que me está dando el 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() 

Respuesta

13

no está seguro acerca de la versión para Mac, pero wxPython ha construido en forma de redirigir los errores en una ventana (que por desgracia se cierran cuando su aplicación se bloquea, pero es útil para detectar errores que silenciosamente fallan) o para un registro archivo (solo se actualiza después de que se cierra la aplicación):

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

estos funcionarán independientemente de cómo inicie su aplicación. Consulte here para obtener más información

1

iniciar la aplicación desde la línea de comandos (creo que su llamado 'terminal' en OS X) como se indica a continuación en lugar de un doble clic en el archivo python. De esta forma, cuando la aplicación falle, verá el seguimiento de la pila.

pitón NameOfScript.py

Alternativamente, puede redirigir la salida a un archivo de registro:

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

bueno, de hecho lo comienzo desde el terminal y aún no se muestra nada: \ Voy a intentar la sugerencia de redirección. – rogeriopvl

+0

Probé la redirección y el archivo de registro termina vacío: \ – rogeriopvl

0

Añadir declaraciones de impresión a su programa, lo que puede indicar cómo se puesta en marcha y donde termina muriendo (saliendo de la terminal como ya dijiste).

0

También podría ejecutar su proyecto desde un IDE de Python, como Eric IDE. ¡Obtienes la ventaja adicional de poder seguir, ver variables y toneladas de otras cosas geniales! :-)

8

Aquí hay una manera de informar el error en la GUI en lugar de en la consola, a través de un MessageDialog. Puede usar el método show_error() en cualquier lugar donde se capture una excepción, aquí simplemente lo atrapo en el nivel más alto. Puede cambiarlo para que la aplicación continúe ejecutándose después de que se produzca el error, si se puede manejar el error.

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

Lanzamiento desde un IDE de Python con un depurador.

Correr en WingIDE puntitos immediatelly los dos problemas:

  • ID_ABOUT debería ser wx.ID_ABOUT (línea # 4 de __init__).
  • OnAboutBox (todo el método) se sangra un paso demasiado. Como está escrito, es una función local dentro de __init__. Mueva todo el método un paso hacia la izquierda para convertirlo en un método de MyApp.
0

Si está utilizando Spyder, presione F6, marque "interactuar con el intérprete de Python después de la ejecución". La ventana no se cerrará, y puede ver el mensaje de error.

Cuestiones relacionadas