Wxpython-event-handling
wxPython-イベント処理
順次実行されるコンソールモードアプリケーションとは異なり、GUIベースのアプリケーションはイベント駆動型です。 関数やメソッドは、ボタンをクリックする、コレクションからアイテムを選択する、マウスクリックなど、イベントと呼ばれるユーザーのアクションに応じて実行されます。
アプリケーションの実行時に発生するイベントに関連するデータは、 wx.Event から派生したサブクラスのオブジェクトとして保存されます。 表示コントロール(Buttonなど)は特定のタイプのイベントのソースであり、それに関連付けられたEventクラスのオブジェクトを生成します。 たとえば、ボタンをクリックするとwx.CommandEventが発生します。 このイベントデータは、プログラムのイベントハンドラーメソッドにディスパッチされます。 wxPythonには、多くの定義済みのイベントバインダーがあります。 *イベントバインダー*は、特定のウィジェット(コントロール)、関連するイベントタイプ、イベントハンドラーメソッド間の関係をカプセル化します。
たとえば、ボタンのクリックイベントでプログラムの* OnClick()メソッド*を呼び出すには、次のステートメントが必要です-
self.b1.Bind(EVT_BUTTON, OnClick)
- Bind()メソッド*は、wx.EvtHandlerクラスのすべての表示オブジェクトに継承されます。 EVT_.BUTTONは、ボタンクリックイベントをOnClick()メソッドに関連付けるバインダーです。
例
次の例では、最上位ウィンドウ(この場合はwx.Frameオブジェクト)のドラッグによって発生したMoveEventは、wx.EVT_MOVEバインダーを使用して* OnMove()メソッド*に接続されます。 コードはウィンドウを表示します。 マウスを使用して移動すると、その瞬間の座標がコンソールに表示されます。
import wx
class Example(wx.Frame):
def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)
self.InitUI()
def InitUI(self):
self.Bind(wx.EVT_MOVE, self.OnMove)
self.SetSize((250, 180))
self.SetTitle('Move event')
self.Centre()
self.Show(True)
def OnMove(self, e):
x, y = e.GetPosition()
print "current window position x = ",x," y= ",y
ex = wx.App()
Example(None)
ex.MainLoop()
上記のコードは、次の出力を生成します-
現在のウィンドウ位置x = 562 y = 309
現在のウィンドウ位置x = 562 y = 309
現在のウィンドウ位置x = 326 y = 304
現在のウィンドウ位置x = 384 y = 240
現在のウィンドウ位置x = 173 y = 408
現在のウィンドウ位置x = 226 y = 30
現在のウィンドウ位置x = 481 y = 80
wx.Eventから継承されたサブクラスのいくつかは、次の表に記載されています-
以下は、wx.Eventの最も一般的に使用されるイベントです。
S.N. | Events & Description |
---|---|
1 |
wxKeyEvent キーが押されるか離されると発生します |
2 |
wxPaintEvent ウィンドウのコンテンツを再描画する必要があるたびに生成されます |
3 |
wxMouseEvent マウスボタンが押された、またはドラッグされたなどのマウスアクティビティによるイベントに関するデータが含まれます |
4 |
wxScrollEvent wxScrollbarやwxSliderなどのスクロール可能なコントロールに関連付けられています |
5 |
wxCommandEvent ボタン、ダイアログ、クリップボードなど、多くのウィジェットから発生したイベントデータが含まれます。 |
6 |
wxMenuEvent メニューコマンドボタンのクリックを除く、さまざまなメニュー関連イベント |
7 |
wxColourPickerEvent wxColourPickerCtrlが生成したイベント |
8 |
wxDirFilePickerEvent FileDialogおよびDirDialogによって生成されるイベント |
wxPythonのイベントには2つのタイプがあります。 基本イベントとコマンドイベント。 基本的なイベントは、元のウィンドウのローカルに留まります。 ほとんどのwxWidgetsはコマンドイベントを生成します。 *コマンドイベント*は、クラス階層のソースウィンドウの上にあるウィンドウに伝播できます。
例
以下は、イベント伝播の簡単な例です。 完全なコードは-
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
b = wx.Button(self, label = 'Btn', pos = (100,100))
b.Bind(wx.EVT_BUTTON, self.btnclk)
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
def OnButtonClicked(self, e):
print 'Panel received click event. propagated to Frame class'
e.Skip()
def btnclk(self,e):
print "Button received click event. propagated to Panel class"
e.Skip()
class Example(wx.Frame):
def __init__(self,parent):
super(Example, self).__init__(parent)
self.InitUI()
def InitUI(self):
mpnl = MyPanel(self)
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
self.SetTitle('Event propagation demo')
self.Centre()
self.Show(True)
def OnButtonClicked(self, e):
print 'click event received by frame class'
e.Skip()
ex = wx.App()
Example(None)
ex.MainLoop()
上記のコードには、2つのクラスがあります。 MyPanel 、wx.PanelサブクラスおよびExample、プログラムのトップレベルウィンドウであるwx.Frameサブクラス。 パネルにボタンが配置されます。
このButtonオブジェクトは、親クラス(この場合はMyPanel)に伝達するイベントハンドラbtnclk()にバインドされています。 ボタンをクリックすると、 CommandEvent が生成されます。これは、Skip()メソッドによって親に伝搬できます。
MyPanelクラスオブジェクトは、受信したイベントを別のハンドラーOnButtonClicked()にバインドします。 この関数は、その親であるExampleクラスに順番に送信します。 上記のコードは、次の出力を生成します-
Button received click event. Propagated to Panel class.
Panel received click event. Propagated to Frame class.
Click event received by frame class.