Question

J'essaie wxpython pour la première fois. J'ai écrit une interface graphique pour un programme python et, lorsque je l'exécute, une erreur est générée, mais l'interface graphique disparaît très rapidement, assez rapidement pour que je ne puisse plus lire les informations d'erreur.

Existe-t-il un journal dans lequel je peux vérifier le message d'erreur? (J'utilise Mac OS X) ou tout autre moyen?

Merci d'avance pour votre aide.

Mise à jour: Voici le code qui me donne le problème ...

#!/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()
Était-ce utile?

La solution

pas sûr de la version mac, mais wxPython a une méthode intégrée pour rediriger les erreurs vers une fenêtre (qui se fermera malheureusement lorsque votre application tombera en panne, mais elle est utile pour détecter les erreurs qui échouent de manière silencieuse) ou dans un fichier journal (uniquement mis à jour après la fermeture de votre application):

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

Cela fonctionnera quelle que soit la manière dont vous démarrez votre application. Voir ici pour plus d'informations

.

Autres conseils

Voici un moyen de signaler l'erreur dans l'interface graphique plutôt que dans la console, via un MessageDialog. Vous pouvez utiliser la méthode show_error () partout où une exception est interceptée. Ici, je la fais attraper au plus haut niveau. Vous pouvez le modifier pour que l'application continue à s'exécuter après l'erreur, si l'erreur peut être traitée.

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()

Lancement depuis un IDE Python avec un débogueur.

L'exécution de WingIDE identifie immédiatement les deux problèmes:

  • ID_ABOUT doit être wx.ID_ABOUT (ligne 4 de __ init __ ).
  • OnAboutBox (toute la méthode) est indenté de trop. Tel qu'écrit, il s'agit d'une fonction locale dans __ init __ . Déplacez la méthode entière d'un pas vers la gauche pour en faire une méthode de MyApp .

Démarrez l’application à partir de la ligne de commande (je pense qu’elle s'appelle 'Terminal' sous OS X) comme indiqué ci-dessous au lieu de double-cliquer sur le fichier python. Ainsi, lorsque l'application se bloque, vous verrez la trace de la pile.

  

NameOfScript.py python

Vous pouvez également rediriger la sortie vers un fichier journal:

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

Ajoutez des instructions d'impression à votre programme pour que vous puissiez savoir comment il démarre et où il finit par mourir (en exécutant à partir du terminal comme vous l'avez déjà dit).

Vous pouvez également exécuter votre projet à partir d'un environnement de développement Python, tel que Eric IDE . Vous obtenez le bonus supplémentaire de pouvoir tracer, regarder des variables et des tonnes d'autres trucs sympas! : -)

Si vous utilisez Spyder, appuyez sur F6, cochez la case "Interagissez avec l'interpréteur python après l'exécution". La fenêtre ne se ferme pas et vous pouvez voir le message d'erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top