0

wxPython に大きな GUI アプリケーションがあります。ボタンを押すたびに、MessageDialogいくつかの結果が表示されます。ダイアログで [OK] と [X] をクリックすると、ダイアログは消えますが、元のボタンのイベントが再び発生します。したがって、ダイアログは 2 回目に表示されるため、無限に続きます。

私のコード(関連部分に最小化):

import wx
from wx import MessageDialog

class Compiler():

    @staticmethod
    def compile(code):
        dialog = MessageDialog(None, code+'\n\n', caption='Compiler result', style=wx.ICON_ERROR|wx.CENTRE)
        dialog.ShowModal()

class GUI ( wx.Frame ):

    def __init__( self):
        wx.Frame.__init__ ( self, None, id = wx.ID_ANY, title = "Test frame", pos = wx.DefaultPosition, size = wx.Size(200, 300), style = wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.TAB_TRAVERSAL )

        theSizer = wx.GridBagSizer( 0, 0 )

        self.theButton = wx.Button( self, wx.ID_ANY, "Hit me!", wx.DefaultPosition, wx.DefaultSize, 0 )
        theSizer.Add( self.theButton, wx.GBPosition( 0, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 )       

        self.SetSizer( theSizer )
        self.Layout()

        self.Centre( wx.BOTH )

        self.theButton.Bind( wx.EVT_LEFT_DOWN, self.execute )

    def execute( self, event ):
        event.Skip()
        print 'Button executed!'
        Compiler.compile('any_input');

if __name__ == '__main__':
    app = wx.App(False)
    GUI().Show() # Launch GUI
    app.MainLoop()

ボタンが 1 回ヒットされた後、フレーム内の任意の場所をクリックすると、イベントが再び発生します。これはなぜですか?

4

1 に答える 1

2

あなたのコードの本当のバグ:

def execute( self, event ):
    event.Skip()
    print 'Button executed!'
    Compiler.compile('any_input');

ですevent.Skip()。それが行うことは、イベントを伝播し続けることです。したがって、イベントは、他のイベント ハンドラーが存在しない場合でも伝達を続け、このイベント ハンドラーによってループ内で継続的に処理および伝達されます。行を削除すると、正常に動作します!

詳細については、このドキュメントをご覧ください

于 2014-08-15T12:20:35.583 に答える