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

창의 내용을 다시 그려야 할 때마다 생성됩니다.

wxMouseEvent

마우스 버튼 누르기 또는 드래그와 같은 마우스 활동으로 인한 모든 이벤트에 대한 데이터를 포함합니다.

4

wxScrollEvent

wxScrollbar 및 wxSlider와 같은 스크롤 가능한 컨트롤과 연결

5

wxCommandEvent

버튼, 대화 상자, 클립 보드 등과 같은 많은 위젯에서 발생하는 이벤트 데이터를 포함합니다.

6

wxMenuEvent

메뉴 명령 버튼 클릭을 제외한 다른 메뉴 관련 이벤트

7

wxColourPickerEvent

wxColourPickerCtrl 생성 이벤트

8

wxDirFilePickerEvent

FileDialog 및 DirDialog에 의해 생성 된 이벤트

wxPython의 이벤트에는 두 가지 유형이 있습니다. 기본 이벤트 및 명령 이벤트. 기본 이벤트는 시작된 창에 로컬로 유지됩니다. 대부분의 wxWidget은 명령 이벤트를 생성합니다. ㅏ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()

위의 코드에는 두 개의 클래스가 있습니다. 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.