2009-05-01 5 views
18

Я пытаюсь wxpython в первый раз. Я написал графический интерфейс для программы python, и когда я запускаю его, он вызывает некоторую ошибку в графическом интерфейсе, но графический интерфейс исчезает очень быстро, достаточно быстро, чтобы я не смог прочитать информацию об ошибке.Как отлаживать приложения wxpython?

Есть ли какой-либо журнал, который я могу проверить на сообщение об ошибке? (Я запускаю 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() 

ответ

13

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

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

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

1

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

питон NameOfScript.py

В качестве альтернативы, вы можете перенаправить вывод в файл журнала:

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

ну, собственно, я запускаю его с терминала, и до сих пор ничего не выводится: \ Я попробую наконечник перенаправления. – rogeriopvl

+0

Я пробовал перенаправление, и файл журнала заканчивается пустым: \ – rogeriopvl

0

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

0

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

8

Здесь можно сообщить об ошибке в графическом интерфейсе, а не консоли, через 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

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

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

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

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

Смежные вопросы