フォーラム | 最新のWeb開発のチュートリアル
 

wxPythonイベント処理


順次実行されるコンソール・モード・アプリケーションとは異なり、GUIベースのアプリケーションはイベント駆動型です。 関数やメソッドは、イベントと呼ばれる、などのコレクションやマウスクリック、から項目を選択し、ボタンをクリックするなどのユーザーのアクションに応じて実行されています。

アプリケーションの実行時に行われたイベントに関連するデータが由来サブクラスのオブジェクトとして格納されてwx.Event 。 表示制御(such as Button) 、特定のタイプのイベントのソースであり、それに関連するイベントクラスのオブジェクトを生成します。 例えば、ボタンのクリックはwx.CommandEventを発します。 このイベントデータは、プログラム内のイベントハンドラメソッドにディスパッチされます。 wxPythonのは、多くのあらかじめ定義されたイベントのバインダーを持っています。 Event binder特定のウィジェットの間の関係をカプセル化(control) 、その関連イベントタイプ、イベントハンドラメソッド。

たとえば、呼び出すためOnClick()ボタンのクリックイベントにプログラムする方法を、次のステートメントが必要です-

self.b1.Bind(EVT_BUTTON, OnClick)

Bind() method wx.EvtHandlerクラスからの全ての表示オブジェクトに継承されます。 EVT_.BUTTONはここにあるボタンのクリックイベントに関連付けバインダー、あるOnClick()メソッドを。


次の例では、トップレベルウィンドウドラッグによって引き起こさMoveEvent、 -この場合wx.Frameオブジェクトが-に接続されているOnMove() wx.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ののほとんどは、コマンドイベントを発生させます。 command eventクラス階層内のソースウィンドウ上である、窓や窓に伝播することができます。


以下は、イベント伝播の簡単な例です。 完全なコードがあります -

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サブクラスおよび実施例は、プログラムのトップレベルウィンドウであるwx.Frameサブクラス。 ボタンはパネル内に配置されます。

このButtonオブジェクトは、イベントハンドラにバインドされているbtnclk()親クラスにそれを伝播する(MyPanel in this case) ボタンのクリックが発生CommandEventによりその親に伝播することができますSkip()メソッドを。

MyPanelクラスオブジェクトは、別のハンドラに受信したイベントをバインドOnButtonClicked() 順番にこの関数は、その親、例のクラスを送信します。 上記のコードは、次の出力を生成します -

イベント処理の出力

Button received click event. Propagated to Panel class. 
Panel received click event. Propagated to Frame class. 
Click event received by frame class.