で最近勉強中なのですが、第3章、特にのダイヤの説明でwxPython
行き詰まっwxPython in Action
てしまいましたFigure 3.3
Skip()
ではStep 3 Locating the binder object
、本は次のように書いています。
オブジェクト自体のバインダーが見つからない場合、処理はクラス階層を上って、オブジェクトのスーパークラスで定義されたバインダーを見つけます。次のステップ。
しかし、次のステップで、次のようにStep 4 Determining whether to continue processing
書いています。
イベント ハンドラーは、wx.Event メソッド Skip() を呼び出して、さらに処理を要求します。Skip() メソッドが呼び出されると、処理が続行され、( 2 ) スーパークラスで定義されたハンドラーが検出され、ステップで実行されます。Skip() メソッドは、ハンドラーの任意の時点で呼び出すことができます。Skip() メソッドは、wxPython がハンドラー メソッドの完了後にチェックするイベント インスタンスにフラグを設定します。リスト 3.3 では、OnButtonClick() は Skip() を呼び出さないため、その場合、イベント プロセスはハンドラ メソッドの最後で完了します。他の 2 つのイベント ハンドラーは Skip() (4) を呼び出すため、システムは一致するイベント バインディングを検索し続けます。(5) 最終的に、マウス オーバー イベントなどのネイティブ ウィジェットのマウス エンター イベントおよびマウス リーブ イベントのデフォルト機能を呼び出します。
私の質問は、文章でマークした数字に関連しています。
(1)私の理解と他のいくつかのグーグル資料では、伝播はクラス階層ではなくコンテナ階層で何かが起こることです、これは正しいですか?
(2) マジ?ハンドラは実行されますか? インスタンスとイベントの組み合わせに一致するものではありませんか?
(3)ここのスーパークラスは正しいですか? 親ウィンドウであってはいけませんか?
(4) この行は質問 2 と矛盾していると思いますが、インスタンスとイベントの組み合わせに一致するハンドラーだけが実行されているのではないでしょうか?
(5) とはdefault functionality
?そしてそれはどのように呼び出されますか?
興味のある方は、listing-3.3.py をご覧ください:
import wx
class MouseEventFrame(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, 'Mouse Events',
size=(300, 200))
self.panel = wx.Panel(self)
self.button = wx.Button(self.panel,
label='Not Over', pos=(100, 15))
self.Bind(wx.EVT_BUTTON, self.OnButtonClick, self.button)
self.button.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)
self.button.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)
def OnButtonClick(self, event):
self.panel.SetBackgroundColour('Green')
self.panel.Refresh()
def OnEnterWindow(self, event):
self.button.SetLabel('Over Me!')
event.Skip()
def OnLeaveWindow(self, event):
self.button.SetLabel('Not Over')
event.Skip()
if __name__ == '__main__':
app = wx.App()
frame = MouseEventFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()