Wxpython-event-handling

提供:Dev Guides
移動先:案内検索

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.