Domanda

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 rapidamente, abbastanza velocemente da non riuscire a leggere le informazioni sull'errore.

Esiste un registro che posso controllare per il messaggio di errore? (Uso 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()
È stato utile?

Soluzione

non sono sicuro della versione per Mac, ma wxPython ha un modo integrato per reindirizzare gli errori a una finestra (che purtroppo si chiuderà quando l'applicazione si blocca, ma è utile per rilevare errori che falliscono silenziosamente) o in un file di registro (solo aggiornato dopo la chiusura dell'applicazione):

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

funzioneranno indipendentemente da come si avvia l'applicazione. Vedi qui per maggiori informazioni

Altri suggerimenti

Ecco un modo per riportare l'errore nella GUI anziché nella console, tramite un MessageDialog. Puoi usare il metodo show_error () ovunque venga rilevata un'eccezione, qui ho appena catturato al livello più alto. Puoi modificarlo in modo che l'app 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()

Avvia da un IDE Python con un debugger.

L'esecuzione in WingIDE individua immediatamente i due problemi:

  • ID_ABOUT dovrebbe essere wx.ID_ABOUT (riga n. 4 di __init__ ).
  • OnAboutBox (l'intero metodo) è rientrato troppo di un passo. Come scritto, è una funzione locale all'interno di __init__ . Sposta l'intero metodo di un passo a sinistra per renderlo un metodo di MyApp .

Avvia l'applicazione dalla riga di comando (credo che si chiama 'Terminale' in OS X) come indicato di seguito invece di fare doppio clic sul file Python. In questo modo quando l'applicazione si arresta in modo anomalo vedrai la traccia dello stack.

  

python NameOfScript.py

In alternativa, puoi reindirizzare l'output su un file di registro:

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

Aggiungi dichiarazioni di stampa al tuo programma, in modo da poter sapere come si sta avviando e dove finisce per morire (eseguendo dal terminale come hai già detto che fai).

Puoi anche eseguire il tuo progetto da un IDE Python, come Eric IDE . Ottieni l'ulteriore vantaggio di essere in grado di rintracciare, guardare variabili e tonnellate di altre cose interessanti! : -)

Se stai usando Spyder, premi F6, controlla " interagisci con l'interprete python dopo l'esecuzione " ;. La finestra non si chiuderà e vedrai il messaggio di errore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top