2009-05-01 34 views
18

Tôi đang thử wxpython lần đầu tiên. Tôi đã viết một GUI cho một chương trình python và khi tôi chạy nó, nó tạo ra một số lỗi trong GUI, nhưng GUI biến mất rất nhanh, đủ nhanh để tôi không thể đọc được thông tin lỗi.Làm thế nào để gỡ lỗi các ứng dụng wxpython?

Có nhật ký nào mà tôi có thể kiểm tra thông báo lỗi không? (Tôi đang chạy Mac OS X) hoặc bất kỳ cách nào khác?

Cảm ơn trước vì đã được trợ giúp.

Cập nhật: Dưới đây là đoạn code đó là đem lại cho tôi những vấn đề ...

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

Trả lời

13

không chắc chắn về phiên bản mac, nhưng wxPython đã tích hợp sẵn để chuyển hướng lỗi tới cửa sổ (rất tiếc khi ứng dụng gặp sự cố, nhưng rất hữu ích khi gặp lỗi âm thầm) hoặc đăng nhập tệp (chỉ được cập nhật sau khi ứng dụng của bạn đóng):

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

chúng sẽ hoạt động bất kể bạn bắt đầu ứng dụng của mình như thế nào. Xem here để biết thêm

1

Khởi động ứng dụng từ dòng lệnh (Tôi tin rằng nó được gọi là 'ga' trong OS X) như đã nêu dưới đây thay vì nhấp đúp trên tệp python. Bằng cách này, khi ứng dụng gặp sự cố, bạn sẽ thấy dấu vết ngăn xếp.

python NameOfScript.py

Ngoài ra, bạn có thể chuyển hướng đầu ra vào một tập tin nhật ký:

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

tốt, thực sự tôi bắt đầu nó từ thiết bị đầu cuối và vẫn không có gì được xuất ra: \ Tôi sẽ thử mẹo chuyển hướng. – rogeriopvl

+0

Tôi đã thử chuyển hướng và tệp nhật ký kết thúc trống: \ – rogeriopvl

0

Thêm báo cáo in vào chương trình của bạn, vì vậy bạn có thể nói như thế nào nó khởi động và nơi nó kết thúc chết (bằng cách chạy từ thiết bị đầu cuối như bạn đã nói bạn làm).

0

Bạn cũng có thể chạy dự án của mình từ một IDE Python, chẳng hạn như Eric IDE. Bạn nhận được thêm tiền thưởng của việc có thể theo dõi, xem các biến và tấn công cụ tuyệt vời khác! :-)

8

Đây là cách để báo cáo lỗi trong GUI thay vì bảng điều khiển, qua MessageDialog. Bạn có thể sử dụng phương thức show_error() ở bất cứ nơi nào ngoại lệ bị bắt, ở đây tôi chỉ có nó bị bắt ở mức cao nhất. Bạn có thể thay đổi nó để ứng dụng tiếp tục chạy sau khi lỗi xảy ra, nếu lỗi có thể được xử lý.

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

Khởi chạy từ một IDE Python bằng trình gỡ lỗi.

Chạy trong WingIDE immediatelly pinpoints hai vấn đề:

  • ID_ABOUT nên wx.ID_ABOUT (dòng # 4 __init__).
  • OnAboutBox (toàn bộ phương pháp) được thụt vào một bước quá nhiều. Như được viết, nó là một hàm cục bộ bên trong __init__. Di chuyển toàn bộ phương thức một bước sang trái để biến nó thành phương thức MyApp.
0

Nếu bạn đang sử dụng Spyder, nhấn F6, hãy kiểm tra "tương tác với trình thông dịch python sau khi thực thi". Cửa sổ sẽ không đóng, và bạn có thể thấy thông báo lỗi.

Các vấn đề liên quan