3

を呼び出して、その親ウィジェットを呼び出すためにOnstaticDown使用したいと思います。event.Skip()onPanelDown

しかしOnstaticDown、呼び出されるだけで、その理由がわかりません。static親パネルがイベントを受信しないのはなぜですか?

私のコード:

 self.panel.Bind(wx.EVT_LEFT_DOWN,self.onPanelDown)
 self.static = wx.StaticText(self.panel, wx.NewId(), "First Name",pos=(10, 50),size=(100,100))
 self.static.Bind(wx.EVT_LEFT_DOWN, self.OnstaticDown)

 def onPanelDown(self,event):
        print 'panel-------------22'
 def OnstaticDown(self,event):
        print 'static============11'
        event.Skip()
4

1 に答える 1

4

event.Skip()コントロールのデフォルトハンドラー(つまり、StaticText)を呼び出します。静的テキストにデフォルトのハンドラーがあるとは思いませんが、対話するように設計されていないため、テキストを表示するための単なるラベルです。

静的なダウンでイベントを処理した後、パネルにイベントを投稿することもできます。または、変更にはあまり適していませんが、イベントwx.PostEvent(self.panel,event)を渡すだけで悪い習慣になるとは思いません。self.onPanelDown(event)

コントロールの親にイベントを渡したり投稿したりする関数をいつでも作成できます

def PostToParent(control,event):
    wx.PostEvent(control.GetParent(),event)


編集: それはそれがどのように機能するかではなく、一部のタイプのイベントのみが親ウィジェットに伝播します(マウスイベントが含まれていないwx.CommandEvent階層内のイベント)。静的テキストのバインディングをコメントアウトしてみてください。右クリックしても、パネルではなく静的テキストをクリックしているため、左下のパネルはトリガーされません。 event.Skip()イベントをマークし、ハンドラーの実行後に他のバインディングに伝播できるようにします。そうしないと、イベントでそれ以上何も起こりません。

この最も明白な例は、ウィンドウを閉じると、フレームがEVT_CLOSEイベントを発行し、wxがウィンドウを取得して閉じます。メソッドをバインドするEVT_CLOSEと、基になるwxイベントハンドラーの前にトリガーされます。呼び出さない場合event.Skip、イベントはwxハンドラーに到達せず、閉じようとしたときにフレームは閉じませんが、呼び出す場合event.Skipは、後でwxイベントハンドラーによって処理され、フレームが閉じられます。

wx.PostEvent一方、イベントを特定のウィジェットに送信し、その特定のイベントにバインドされたバインディングを使用して、イベントを処理する方法です。この場合、左下のイベントをパネルに転送すると、パネルを自分でクリックするのと同じ効果があります。

于 2012-07-23T09:44:59.540 に答える