📅  最后修改于: 2020-11-05 04:58:23             🧑  作者: Mango
与以顺序方式执行的控制台模式应用程序不同,基于GUI的应用程序是事件驱动的。函数或方法是根据用户的操作(例如单击按钮,从集合中选择项目或单击鼠标等)而执行的,称为事件。
与在应用程序运行时发生的事件有关的数据存储为派生自wx.Event的子类的对象。显示控件(例如Button)是特定类型的事件的源,并产生与之关联的Event类的对象。例如,单击按钮将发出wx.CommandEvent。此事件数据被分派到程序中的事件处理程序方法。 wxPython有许多预定义的事件绑定器。事件绑定器封装了特定窗口小部件(控件),其关联的事件类型和事件处理程序方法之间的关系。
例如,要在按钮的click事件上调用程序的OnClick()方法,需要以下语句-
self.b1.Bind(EVT_BUTTON, OnClick)
Bind()方法由wx.EvtHandler类的所有显示对象继承。 EVT_.BUTTON是活页夹,它将按钮单击事件与OnClick()方法相关联。
在以下示例中,通过拖动顶层窗口(在这种情况下为wx.Frame对象)引起的MoveEvent使用wx.EVT_MOVE绑定程序连接到OnMove()方法。该代码显示一个窗口。如果使用鼠标移动,则其瞬时坐标将显示在控制台上。
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的子类-
S.N. | Events & Description |
---|---|
1 |
wxKeyEvent Occurs when a key is presses or released |
2 |
wxPaintEvent Is generated whenever contents of the window needs to be redrawn |
3 |
wxMouseEvent Contains data about any event due to mouse activity like mouse button pressed or dragged |
4 |
wxScrollEvent Associated with scrollable controls like wxScrollbar and wxSlider |
5 |
wxCommandEvent Contains event data originating from many widgets such as button, dialogs, clipboard, etc. |
6 |
wxMenuEvent Different menu-related events excluding menu command button click |
7 |
wxColourPickerEvent wxColourPickerCtrl generated events |
8 |
wxDirFilePickerEvent Events generated by FileDialog and DirDialog |
wxPython中的事件有两种类型。基本事件和命令事件。基本事件在发生事件的窗口中保持局部状态。大多数wxWidgets都会生成命令事件。可以将命令事件传播到类层次结构中位于源窗口上方的一个或多个窗口。
以下是事件传播的简单示例。完整的代码是-
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对象绑定到事件处理程序btnclk(),该事件处理程序将其传播到父类(在本例中为MyPanel)。单击按钮会生成一个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.