Как отлаживать приложения wxpython?
Я пытаюсь wxpython в первый раз. Я написал графический интерфейс для программы python, и когда я запускаю его, он вызывает некоторую ошибку в графическом интерфейсе, но графический интерфейс исчезает очень быстро, достаточно быстро, чтобы я не смог прочитать информацию об ошибке.
Есть ли какой-либо журнал, который я могу проверить для сообщения об ошибке? (Я запускаю 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()
Ответы
Ответ 1
не уверен в версии для Mac, но wxPython имеет встроенный способ перенаправления ошибок в окно (которое, к сожалению, будет закрыто при сбое приложения, но оно полезно для ловушек, которые терпят неудачу) или в файл журнала (только обновляется после закрытия вашего приложения):
app = wx.App(redirect=True)
app = wx.App(redirect=True,filename="mylogfile.txt")
они будут работать независимо от того, как вы начинаете свое приложение. См. здесь для более
Ответ 2
Здесь можно сообщить об ошибке в графическом интерфейсе вместо консоли через 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()
Ответ 3
Запустите из IDE Python с помощью отладчика.
Запуск в WingIDE сразу определяет две проблемы:
-
ID_ABOUT
должен быть wx.ID_ABOUT
(строка # 4 из __init__
).
-
OnAboutBox
(весь метод) имеет отступы на один шаг. Как написано, это локальная функция внутри __init__
. Переместите весь метод на один шаг влево, чтобы сделать его методом MyApp
.
Ответ 4
Запустите приложение из командной строки (я считаю, что он называется "Terminal" в OS X), как указано ниже, вместо двойного щелчка на файле python. Таким образом, при сбое приложения вы увидите трассировку стека.
python NameOfScript.py
В качестве альтернативы вы можете перенаправить вывод в файл журнала:
f=open('app.log','w')
import sys
sys.stdout=f
sys.stderr=f
Ответ 5
Добавьте в свою программу утверждения печати, чтобы вы могли узнать, как он запускается и где он заканчивается, умирая (при запуске с терминала, как вы уже сказали, что есть).
Ответ 6
Вы также можете запустить свой проект из IDE Python, например Eric IDE. Вы получаете дополнительный бонус от возможности отслеживать, смотреть переменные и множество других интересных вещей!: -)
Ответ 7
Если вы используете Spyder, нажмите F6, проверьте "взаимодействовать с интерпретатором python после выполнения".
Окно не будет закрыто, и вы увидите сообщение об ошибке.