Вопрос

Я впервые пробую 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()
Это было полезно?

Решение

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

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()

Запуск из среды разработки Python с помощью отладчика.

Бегущий в Крылатый сразу же выявляются две проблемы:

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

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

  

python NameOfScript.py

Кроме того, вы можете перенаправить вывод в файл журнала:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top