質問

wxpythonを初めて試しています。 Pythonプログラム用にGUIを作成しましたが、実行するとGUIにエラーが発生しますが、GUIはすぐに消えてしまい、エラー情報を読むことができなくなりました。

エラーメッセージを確認できるログはありますか? (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を使用して、コンソールではなく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()

デバッガを使用してPython IDEから起動します。

WingIDE で実行すると、2つの問題が即座に特定されます。

  • ID_ABOUT wx.ID_ABOUT である必要があります( __ init __ の4行目)。
  • OnAboutBox (メソッド全体)が1ステップインデントされすぎています。書かれているように、それは __ init __ 内のローカル関数です。メソッド全体を1ステップ左に移動して、 MyApp のメソッドにします。

pythonファイルをダブルクリックする代わりに、以下に示すように、コマンドライン(OS Xでは「ターミナル」と呼ばれると思います)からアプリケーションを起動します。これにより、アプリケーションがクラッシュしたときにスタックトレースが表示されます。

  

python NameOfScript.py

または、出力をログファイルにリダイレクトすることもできます:

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

プログラムにprintステートメントを追加して、プログラムの起動方法と終了位置を確認できるようにします(既に述べたようにターミナルから実行することで)。

Eric IDE などのPython IDEからプロジェクトを実行することもできます。変数や他のたくさんのクールなものをトレース、監視できるという追加のボーナスが得られます! :-)

Spyderを使用している場合は、F6キーを押し、「実行後にpythonインタープリターと対話する」をチェックします。 ウィンドウは閉じず、エラーメッセージが表示されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top