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.