2009-05-01 167 views
18

我想第一次使用wxpython。我爲一個python程序編寫了一個GUI,當我運行它時,它在GUI中產生了一些錯誤,但GUI非常快速地消失,足夠快以至於我無法讀取錯誤信息。如何調試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

不知道Mac版本,但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 2009-05-01 19:48:14

0

添加打印語句的程序,所以你可以告訴它是如何啓動和最終死去的地方(通過從終端運行,就像你已經說過的那樣)。

0

您還可以從Python IDE運行項目,如Eric IDE。你可以追蹤,觀察變量和其他很酷的東西! :-)

8

下面是通過MessageDialog在GUI中報告錯誤的方法,而不是控制檯。你可以在發生異常的任何地方使用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

使用調試器從Python IDE啓動。

WingIDE運行immediatelly精確定位的兩個問題:

  • ID_ABOUTwx.ID_ABOUT(線#4的__init__)。
  • OnAboutBox(整個方法)縮進一步太多。正如所寫的,它是__init__中的一個本地函數。將整個方法向左移一步,使其成爲MyApp的一種方法。
0

如果您使用的是Spyder,請按F6,選中「在執行後與python解釋器交互」。 窗口不會關閉,您可以看到錯誤消息。