wxPython - Xử lý sự kiện

Không giống như ứng dụng ở chế độ console, được thực thi theo cách tuần tự, ứng dụng dựa trên GUI được điều khiển bởi sự kiện. Các hàm hoặc phương thức được thực thi để đáp lại các hành động của người dùng như nhấp vào nút, chọn một mục từ bộ sưu tập hoặc nhấp chuột, v.v., được gọi là sự kiện.

Dữ liệu liên quan đến sự kiện diễn ra trong thời gian chạy của ứng dụng được lưu trữ dưới dạng đối tượng của lớp con bắt nguồn từ wx.Event. Điều khiển hiển thị (chẳng hạn như Nút) là nguồn sự kiện của một kiểu cụ thể và tạo ra một đối tượng của lớp Sự kiện được liên kết với nó. Ví dụ, nhấp vào một nút sẽ tạo ra một wx.CommandEvent. Dữ liệu sự kiện này được gửi đến phương thức xử lý sự kiện trong chương trình. wxPython có nhiều chất kết dính sự kiện được xác định trước. AnEvent binder đóng gói mối quan hệ giữa một widget cụ thể (điều khiển), loại sự kiện liên quan của nó và phương thức xử lý sự kiện.

Ví dụ, để gọi OnClick() method của chương trình trên sự kiện nhấp vào nút, câu lệnh sau là bắt buộc:

self.b1.Bind(EVT_BUTTON, OnClick)

Bind() methodđược kế thừa bởi tất cả các đối tượng hiển thị từ lớp wx.EvtHandler. EVT_.BUTTON ở đây là chất kết dính, liên kết sự kiện nhấp vào nút với phương thức OnClick ().

Thí dụ

Trong ví dụ sau, MoveEvent, gây ra bằng cách kéo cửa sổ cấp cao nhất - một đối tượng wx.Frame trong trường hợp này - được kết nối với OnMove() methodbằng cách sử dụng chất kết dính wx.EVT_MOVE. Mã hiển thị một cửa sổ. Nếu nó được di chuyển bằng chuột, tọa độ tức thời của nó được hiển thị trên bảng điều khiển.

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()

Đoạn mã trên tạo ra kết quả sau:

vị trí cửa sổ hiện tại x = 562 y = 309

vị trí cửa sổ hiện tại x = 562 y = 309

vị trí cửa sổ hiện tại x = 326 y = 304

vị trí cửa sổ hiện tại x = 384 y = 240

vị trí cửa sổ hiện tại x = 173 y = 408

vị trí cửa sổ hiện tại x = 226 y = 30

vị trí cửa sổ hiện tại x = 481 y = 80

Một số lớp con kế thừa từ wx.Event được liệt kê trong bảng sau:

SN Sự kiện & Mô tả
1

wxKeyEvent

Xảy ra khi nhấn hoặc thả một phím

2

wxPaintEvent

Được tạo bất cứ khi nào nội dung của cửa sổ cần được vẽ lại

3

wxMouseEvent

Chứa dữ liệu về bất kỳ sự kiện nào do hoạt động của chuột như nút chuột được nhấn hoặc kéo

4

wxScrollEvent

Được liên kết với các điều khiển có thể cuộn như wxScrollbar và wxSlider

5

wxCommandEvent

Chứa dữ liệu sự kiện bắt nguồn từ nhiều tiện ích con như nút, hộp thoại, khay nhớ tạm, v.v.

6

wxMenuEvent

Các sự kiện liên quan đến menu khác nhau ngoại trừ nhấp vào nút lệnh menu

7

wxColourPickerEvent

sự kiện được tạo wxColourPickerCtrl

số 8

wxDirFilePickerEvent

Sự kiện được tạo bởi FileDialog và DirDialog

Sự kiện trong wxPython có hai loại. Sự kiện cơ bản và sự kiện Lệnh. Một sự kiện cơ bản vẫn nằm cục bộ đối với cửa sổ mà nó bắt nguồn. Hầu hết các wxWidgets đều tạo ra các sự kiện lệnh. Acommand event có thể được truyền tới cửa sổ hoặc các cửa sổ nằm phía trên cửa sổ nguồn trong hệ thống phân cấp lớp.

Thí dụ

Sau đây là một ví dụ đơn giản về lan truyền sự kiện. Mã hoàn chỉnh là -

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()

Trong đoạn mã trên, có hai lớp. MyPanel, một lớp con wx.Panel và Ví dụ, một lớp con wx.Frame là cửa sổ cấp cao nhất cho chương trình. Một nút được đặt trong bảng điều khiển.

Đối tượng Nút này được liên kết với một trình xử lý sự kiện btnclk () truyền nó đến lớp cha (MyPanel trong trường hợp này). Nhấp vào nút tạo ra mộtCommandEvent có thể được truyền tới cha của nó bằng phương thức Skip ().

Đối tượng lớp MyPanel cũng liên kết sự kiện đã nhận với một trình xử lý khác OnButtonClicked (). Đến lượt nó, hàm này truyền đến lớp cha của nó, lớp Ví dụ. Đoạn mã trên tạo ra kết quả sau:

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