سؤال

أنا أحاول 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()
هل كانت مفيدة؟

المحلول

وغير متأكدة من إصدار لجنة الهدنة العسكرية، ولكن كسبيثون وقد بنيت في طريقة لإعادة توجيه الأخطاء إلى نافذة (والتي سوف أسف قريب عندما تعطل التطبيق الخاص بك، ولكن من المفيد لالتقاط الأخطاء التي تفشل بصمت) أو إلى ملف سجل (فقط تحديثها بعد طلبك يغلق):

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

وهذه ستعمل بغض النظر عن كيفية بدء التطبيق الخاص بك. انظر هنا لأكثر

نصائح أخرى

وإليك طريقة لجعل الخطأ أن ذكرت في واجهة المستخدم الرسومية بدلا من وحدة التحكم، عبر 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()

إطلاق من الثعبان IDE مع مصحح أخطاء.

تشغيل في WingIDE immediatelly يبرز مشكلتين:

  • ID_ABOUT يجب أن يكون wx.ID_ABOUT (الخط رقم 4 من __init__).
  • OnAboutBox (كامل الأسلوب) هو بادئة خطوة واحدة أكثر من اللازم.كما هو مكتوب انه المحلية وظيفة داخل __init__.نقل كلها الأسلوب خطوة واحدة إلى اليسار لجعل طريقة MyApp.

وبدء تشغيل التطبيق من سطر الأوامر (وأعتقد به يسمى 'محطة' في OS X) كما هو موضح أدناه بدلا من النقر المزدوج على الملف الثعبان. بهذه الطريقة عندما تعطل تطبيق سترى تتبع المكدس.

<اقتباس فقرة>   

والثعبان NameOfScript.py

وبدلا من ذلك، يمكنك إعادة توجيه الإخراج إلى ملف السجل:

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

واضافة بيانات الطباعة إلى البرنامج، لذلك يمكن أن أقول لكم كيف انها بدء وأين ينتهي الموت (عن طريق يمتد من محطة كما قلت بالفعل لديك).

ويمكنك أيضا تشغيل المشروع من بيثون IDE، مثل اريك IDE . تحصل على مكافأة إضافية لتكون قادرة على تتبع ومشاهدة المتغيرات وطن من الاشياء باردة أخرى! : -)

إذا كنت تستخدم سبايدر، ضرب F6، تحقق "التفاعل مع مترجم الثعبان بعد تنفيذ". سوف نافذة لن تغلق، ويمكنك ان ترى رسالة الخطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top