wxPython - การจัดการเหตุการณ์

แตกต่างจากแอปพลิเคชันโหมดคอนโซลซึ่งดำเนินการในลักษณะตามลำดับแอปพลิเคชันที่ใช้ GUI จะขับเคลื่อนด้วยเหตุการณ์ ฟังก์ชันหรือวิธีการทำงานเพื่อตอบสนองต่อการกระทำของผู้ใช้เช่นการคลิกปุ่มเลือกรายการจากคอลเลกชันหรือคลิกเมาส์เป็นต้นเรียกว่าเหตุการณ์

ข้อมูลที่เกี่ยวข้องกับเหตุการณ์ที่เกิดขึ้นระหว่างรันไทม์ของแอ็พพลิเคชันจะถูกเก็บไว้เป็นอ็อบเจ็กต์ของคลาสย่อยที่ได้มาจาก wx.Event. การควบคุมการแสดงผล (เช่นปุ่ม) เป็นแหล่งที่มาของเหตุการณ์ของชนิดหนึ่ง ๆ และสร้างออบเจ็กต์ของคลาสเหตุการณ์ที่เกี่ยวข้อง ตัวอย่างเช่นการคลิกปุ่มจะแสดง wx.CommandEvent ข้อมูลเหตุการณ์นี้ถูกส่งไปยังเมธอดตัวจัดการเหตุการณ์ในโปรแกรม wxPython มีตัวประสานเหตุการณ์ที่กำหนดไว้ล่วงหน้ามากมาย อันEvent binder สรุปความสัมพันธ์ระหว่างวิดเจ็ตเฉพาะ (ตัวควบคุม) ประเภทเหตุการณ์ที่เกี่ยวข้องและวิธีการจัดการเหตุการณ์

เช่นโทร OnClick() method ของโปรแกรมในเหตุการณ์การคลิกของปุ่มจำเป็นต้องมีคำสั่งต่อไปนี้ -

self.b1.Bind(EVT_BUTTON, OnClick)

Bind() methodได้รับการสืบทอดโดยวัตถุแสดงทั้งหมดจากคลาส wx.EvtHandler EVT_.BUTTON นี่คือ binder ซึ่งเชื่อมโยงเหตุการณ์การคลิกปุ่มกับวิธี OnClick ()

ตัวอย่าง

ในตัวอย่างต่อไปนี้ MoveEvent ซึ่งเกิดจากการลากหน้าต่างระดับบนสุด - วัตถุ wx.Frame ในกรณีนี้ - เชื่อมต่อกับ OnMove() methodใช้ wx.EVT_MOVE binder รหัสจะแสดงหน้าต่าง หากมีการเคลื่อนย้ายโดยใช้เมาส์พิกัดทันทีจะแสดงบนคอนโซล

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 มีสองประเภท เหตุการณ์พื้นฐานและเหตุการณ์คำสั่ง เหตุการณ์พื้นฐานยังคงอยู่ภายในหน้าต่างที่เกิดขึ้น 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()

ในโค้ดด้านบนมีสองคลาส MyPanel, คลาสย่อย wx.Panel และตัวอย่างคลาสย่อย wx.Frame ซึ่งเป็นหน้าต่างระดับบนสุดของโปรแกรม ปุ่มวางอยู่บนแผงควบคุม

อ็อบเจ็กต์ปุ่มนี้ถูกผูกไว้กับตัวจัดการเหตุการณ์ btnclk () ซึ่งแพร่กระจายไปยังคลาสพาเรนต์ (MyPanel ในกรณีนี้) การคลิกปุ่มสร้างไฟล์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.