wxPython-イベント処理
順次実行されるコンソールモードアプリケーションとは異なり、GUIベースのアプリケーションはイベント駆動型です。関数またはメソッドは、ボタンのクリック、コレクションからのアイテムの選択、マウスのクリックなど、イベントと呼ばれるユーザーのアクションに応答して実行されます。
アプリケーションの実行時に発生するイベントに関連するデータは、から派生したサブクラスのオブジェクトとして保存されます。 wx.Event。表示コントロール(Buttonなど)は、特定のタイプのイベントのソースであり、それに関連付けられたEventクラスのオブジェクトを生成します。たとえば、ボタンをクリックすると、wx.CommandEventが発行されます。このイベントデータは、プログラムのイベントハンドラメソッドにディスパッチされます。wxPythonには、多くの事前定義されたイベントバインダーがあります。アンEvent binder 特定のウィジェット(コントロール)、それに関連付けられたイベントタイプ、およびイベントハンドラーメソッド間の関係をカプセル化します。
たとえば、 OnClick() method ボタンのクリックイベントでのプログラムの場合、次のステートメントが必要です-
self.b1.Bind(EVT_BUTTON, OnClick)
Bind() methodwx.EvtHandlerクラスからすべての表示オブジェクトに継承されます。EVT_.BUTTONは、ボタンクリックイベントをOnClick()メソッドに関連付けるバインダーです。
例
次の例では、トップレベルウィンドウ(この場合はwx.Frameオブジェクト)をドラッグすることによって発生するMoveEventがに接続されています。 OnMove() methodwx.EVT_MOVEバインダーを使用します。コードはウィンドウを表示します。マウスを使用して移動すると、その瞬間の座標がコンソールに表示されます。
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から継承されたサブクラスのいくつかを次の表に示します-
SN | イベントと説明 |
---|---|
1 | wxKeyEvent キーを押すか離すと発生します |
2 | wxPaintEvent ウィンドウの内容を再描画する必要があるときはいつでも生成されます |
3 | wxMouseEvent マウスボタンの押下やドラッグなどのマウスアクティビティによるイベントに関するデータが含まれます |
4 | wxScrollEvent wxScrollbarやwxSliderなどのスクロール可能なコントロールに関連付けられています |
5 | wxCommandEvent ボタン、ダイアログ、クリップボードなどの多くのウィジェットから発信されたイベントデータが含まれています。 |
6 | wxMenuEvent メニューコマンドボタンのクリックを除く、さまざまなメニュー関連のイベント |
7 | wxColourPickerEvent wxColourPickerCtrlで生成されたイベント |
8 | wxDirFilePickerEvent FileDialogおよびDirDialogによって生成されたイベント |
wxPythonのイベントには2つのタイプがあります。基本イベントとコマンドイベント。基本的なイベントは、それが発生したウィンドウに対してローカルのままです。ほとんどのwxWidgetsはコマンドイベントを生成します。Acommand event クラス階層のソースウィンドウの上にある1つまたは複数のウィンドウに伝播できます。
例
以下は、イベント伝播の簡単な例です。完全なコードは-です
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.