Как отлаживать приложения wxpython? - PullRequest
18 голосов
/ 01 мая 2009

Я пробую wxpython впервые. Я написал GUI для программы на Python, и когда я запускаю его, в GUI выдается какая-то ошибка, но GUI исчезает очень быстро, достаточно быстро, чтобы я не смог прочитать информацию об ошибке.

Есть ли журнал, который я могу проверить на наличие сообщения об ошибке? (У меня Mac OS X) или другим способом?

Заранее спасибо за любую помощь.

Обновление: вот код, который вызывает у меня проблему ...

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

Ответы [ 7 ]

13 голосов
/ 02 мая 2009

не уверен насчет версии для mac, но в wxPython есть встроенный способ перенаправления ошибок в окно (которое, к сожалению, закроется при сбое вашего приложения, но это полезно для перехвата ошибок, которые молча завершаются ошибкой) или в файл журнала (только обновляется после закрытия приложения):

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

они будут работать независимо от того, как вы запустите свое приложение. Смотрите здесь , чтобы узнать больше

8 голосов
/ 02 мая 2009

Вот способ сообщения об ошибке в графическом интерфейсе вместо консоли через MessageDialog. Вы можете использовать метод show_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 голосов
/ 02 мая 2009

Запуск из Python IDE с отладчиком.

Запуск в WingIDE немедленно определяет две проблемы:

  • ID_ABOUT должно быть wx.ID_ABOUT (строка № 4 из __init__).
  • OnAboutBox (весь метод) отступ на один шаг слишком много. Как написано, это локальная функция внутри __init__. Переместите весь метод на один шаг влево, чтобы сделать его методом MyApp.
1 голос
/ 01 мая 2009

Запустите приложение из командной строки (я думаю, что в OS X оно называется «Терминал»), как указано ниже, вместо двойного щелчка по файлу python Таким образом, при сбое приложения вы увидите трассировку стека.

python NameOfScript.py

Кроме того, вы можете перенаправить вывод в файл журнала:

f=open('app.log','w')
import sys
sys.stdout=f
sys.stderr=f
0 голосов
/ 04 февраля 2013

Если вы используете Spyder, нажмите F6, установите флажок «взаимодействовать с интерпретатором python после выполнения». Окно не закроется, и вы увидите сообщение об ошибке.

0 голосов
/ 02 мая 2009

Вы также можете запустить свой проект из Python IDE, например Eric IDE . Вы получаете дополнительный бонус за возможность отслеживать, просматривать переменные и множество других интересных вещей! : -)

0 голосов
/ 02 мая 2009

Добавьте операторы печати в вашу программу, чтобы вы могли сказать, как она запускается и где она заканчивается (при запуске из терминала, как вы уже сказали).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...