Frage

Ich versuche wxpython zum ersten Mal. Ich habe eine GUI für ein Python-Programm geschrieben und wenn ich es laufen, erzeugt es einige Fehler in der GUI, aber die GUI verschwindet sehr schnell, schnell genug für mich nicht in der Lage sein, den Fehler Info zu lesen.

Gibt es ein Protokoll, dass ich für die Fehlermeldung überprüfen? (Ich bin mit Mac OS X) oder jede andere Art und 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()
War es hilfreich?

Lösung

über die Mac-Version nicht sicher, aber WxPython ein in Art und Weise Fehler zu einem Fenster (was leider schließen, wenn die Anwendung abstürzt, aber es ist nützlich für Fehler zu kontrollieren, die unbemerkt fehlschlagen) zu umleiten gebaut hat oder in eine Protokolldatei (nur aktualisiert, nachdem die Anwendung geschlossen wird):

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

diese funktioniert unabhängig davon, wie Sie Ihre Anwendung starten. Siehe hier für mehr

Andere Tipps

Hier ist ein Weg, um den Fehler zu haben, in der GUI statt der Konsole gemeldet wird, über einen MessageDialog. Sie können die show_error () -Methode verwenden überall eine Ausnahme gefangen, hier habe ich es nur auf der obersten Ebene die meisten gefangen. Sie können es ändern, so dass der App lief weiter, nachdem der Fehler auftritt, wenn der Fehler gehandhabt 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()

Starten von einer Python IDE mit einem Debugger.

Beim Laufen in WingIDE immediatelly lokalisiert die beiden Probleme:

  • ID_ABOUT sollte wx.ID_ABOUT (Linie 4 von __init__) werden.
  • OnAboutBox (das gesamte Verfahren) ist ein Schritt zu viel eingerückt. Wie schon geschrieben, es ist eine lokale Funktion innerhalb __init__. Bewegen Sie das ganze Verfahren einen Schritt nach links es ein Verfahren zur Herstellung MyApp zu machen.

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

  

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

print-Anweisungen zu Ihrem Programm hinzufügen, so können Sie sagen, wie es beginnt und wo es endet zu sterben (durch vom Terminal laufen, wie Sie bereits gesagt, Sie tun).

Sie können auch Ihr Projekt von einem Python-IDE, wie Eric IDE laufen. Sie erhalten die zusätzlichen Bonus verfolgen zu können, Variablen und jede Menge anderer cooler Sachen zu sehen! : -)

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top