python 模拟事件触发机制

EventManager.py

 1 # -*- encoding: UTF-8 -*-
 2
 3 # 系统模块
 4 from queue import Queue, Empty
 5 from threading import *
 6
 7
 8 class EventManager:
 9     def __init__(self):
10         """初始化事件管理器"""
11         # 事件对象列表
12         self.__eventQueue = Queue()
13         # 事件管理器开关
14         self.__active = False
15         # 事件处理线程
16         self.__thread = Thread(target = self.__Run)
17
18         # 这里的__handlers是一个字典,用来保存对应的事件的响应函数
19         # 其中每个键对应的值是一个列表,列表中保存了对该事件监听的响应函数,一对多
20         self.__handlers = {}   # {事件类型:[处理事件的方法]}
21
22     def __Run(self):
23         """引擎运行"""
24         while self.__active == True:
25             try:
26                 # 获取事件的阻塞时间设为1秒
27                 event = self.__eventQueue.get(block = True, timeout = 1)
28                 self.__EventProcess(event)
29             except Empty:
30                 pass
31
32     def __EventProcess(self, event):
33         """处理事件"""
34         # 检查是否存在对该事件进行监听的处理函数
35         if event.type_ in self.__handlers:
36             # 若存在,则按顺序将事件传递给处理函数执行
37             for handler in self.__handlers[event.type_]:
38                 handler(event)
39
40     def Start(self):
41         """启动"""
42         # 将事件管理器设为启动
43         self.__active = True
44         # 启动事件处理线程
45         self.__thread.start()
46
47     def Stop(self):
48         """停止"""
49         # 将事件管理器设为停止
50         self.__active = False
51         # 等待事件处理线程退出
52         self.__thread.join()
53
54     def AddEventListener(self, type_, handler):
55         """绑定事件和监听器处理函数"""
56         # 尝试获取该事件类型对应的处理函数列表,若无则创建
57         try:
58             handlerList = self.__handlers[type_]
59         except KeyError:
60             handlerList = []
61
62         self.__handlers[type_] = handlerList
63         # 若要注册的处理器不在该事件的处理器列表中,则注册该事件
64         if handler not in handlerList:
65             handlerList.append(handler)
66
67     def RemoveEventListener(self, type_, handler):
68         """移除监听器的处理函数"""
69         #读者自己试着实现
70
71     def SendEvent(self, event):
72         """发送事件,向事件队列中存入事件"""
73         self.__eventQueue.put(event)
74
75 """事件对象"""
76 class Event:
77     def __init__(self, type_=None):
78         self.type_ = type_      # 事件类型
79         self.dict = {}          # 字典用于保存具体的事件数据

test.py

 1 # -*- encoding: UTF-8 -*-
 2
 3 from threading import *
 4 from EventManager import *
 5 import time
 6
 7 #事件名称  新文章
 8 EVENT_ARTICAL = "Event_Artical"
 9
10
11 #事件源 公众号
12 class PublicAccounts:
13     def __init__(self,eventManager):
14         self.__eventManager = eventManager
15
16     def WriteNewArtical(self):
17         #事件对象,写了新文章
18         event = Event(type_=EVENT_ARTICAL)
19         event.dict["artical"] = u‘如何写出更优雅的代码\n‘
20         #发送事件
21         self.__eventManager.SendEvent(event)
22         print(u‘公众号发送新文章‘)
23
24
25 #监听器 订阅者
26 class Listener:
27     def __init__(self,username):
28         self.__username = username
29
30     #监听器的处理函数 读文章
31     def ReadArtical(self,event):
32         print(u‘%s 收到新文章‘ % self.__username)
33         print(u‘正在阅读新文章内容:%s‘  % event.dict["artical"])
34
35
36 """测试函数"""
37 def test():
38     listner1 = Listener("thinkroom") #订阅者1
39     listner2 = Listener("steve")#订阅者2
40
41     eventManager = EventManager()
42
43     #绑定事件和监听器响应函数(新文章)
44     eventManager.AddEventListener(EVENT_ARTICAL, listner1.ReadArtical)
45     eventManager.AddEventListener(EVENT_ARTICAL, listner2.ReadArtical)
46     eventManager.Start()
47
48     publicAcc = PublicAccounts(eventManager)
49     while True:
50         publicAcc.WriteNewArtical()
51         time.sleep(2)
52
53 if __name__ == ‘__main__‘:
54     test()

原文地址:https://www.cnblogs.com/gundan/p/8313396.html

时间: 2024-10-03 21:28:54

python 模拟事件触发机制的相关文章

C#事件触发机制

C#的事件触发机制,类似于c++的回调函数机制 我先简单说一下,委托和事件的实质,后期再重开一篇博文来详细说 委托:指向方法的指针,类似于C的函数指针 事件:是一个可以存放0个或多个方法指针的数据结构  .......... 在一次编译后会为其生成一个类等等的就以后另开博文说了 看看触发机制 方便理解,来个通俗一点的图 事件触发源类 class cclass { private char i; public delegate void ichanged(cclass s); public eve

事件触发机制

首先我们先弄明白浏览器事件触发机制,分为三个阶段: 1. 事件捕获阶段:window 往事件触发处传播,遇到注册的捕获事件会触发 (addEventListener 的 true) 2. 事件目标处理函数:传播到事件触发处时触发注册的事件 (博主没搞懂这个阶段) 3. 事件冒泡阶段:从事件触发处往 window 传播,遇到注册的冒泡事件会触发(addEventListener 的 false 和 onclick.onmouseover...) addEventListener dom.addEv

EventEmitter:nodeJs事件触发机制

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列 Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件. 所有这些产生事件的对象都是 events.EventEmitter 的实例 NodeJs事件监听触发机制依赖 events 核心模块, events 模块只提供了一个对象: events.EventEmitter.EventEmitter

[转载] 理解 epoll 的事件触发机制

原文: http://weibo.com/p/1001603862394207076573?sudaref=weibo.com epoll的I/O事件触发方式有两种模式:ET(Edge Triggered)和LT(Level Triggered). 这个触发模式其实是events(事件)的属性,该属性是和POLLIN.POLLOUT等属性并列且混杂使用的,而events有时依附在fd(文件描述符)上的,所以可以说:这个触发模式是events所依附的fd的属性.区分events和fd的原因是ker

cocos2d-x 事件分发机制 ——触摸事件监听

cocos2d-x 3.0 出来已经好久了,也已经用3.0写了几个小游戏,感觉3.0的事件触发机制太赞了,随这里总结一下,也算是对知识的一种回忆和加深理解. 3.0的事件分发机制中,需要也仅仅需要通过创建一个事件监听器来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所有的事件监听器由这个分发器统一管理,即可完成事件响应. 事件监听器有以下几种: 1.EventListenerTouch(触摸事件) 2.EventListenerKeyboard(键盘响应事件) 3.

Android Activity 和 ViewGroup中事件触发和传递机制

1.在只有Activity的情况: 1)Touch事件触发流程: 首先触发dispatchTouchEvent 然后触发onUserInteraction 再次onTouchEvent 如果是点击的话,紧跟着下列事件(点击分俩步,ACTION_DOWN,ACTION_up) 触发dispatchTouchEvent 再次onTouchEvent 当ACTION_up事件时不会触发onUserInteraction(可查看源代码) 2)键盘事件触发流程 首先触发dispatchKeyEvent 然

【cocos2d-js官方文档】十七、事件分发机制

简介 游戏开发中一个很重要的功能就是交互,如果没有与用户的交互,那么游戏将变成动画,而处理用户交互就需要使用事件监听器了. 总概: 事件监听器(cc.EventListener) 封装用户的事件处理逻辑 事件管理器(cc.eventManager) 管理用户注册的事件监听器,根据触发的事件类型分发给相应的事件监听器 事件对象(cc.Event) 包含事件相关信息的对象 如何使用呢? 首先需要创建一个事件监听器,事件监听器包含以下几种类型: 触摸事件监听器 (cc.EventListenerTou

【cocos2d-js公文】十七、事件分发机制

简单介绍 游戏开发中一个非常重要的功能就是交互,假设没有与用户的交互.那么游戏将变成动画,而处理用户交互就须要使用事件监听器了. 总概: 事件监听器(cc.EventListener) 封装用户的事件处理逻辑 事件管理器(cc.eventManager) 管理用户注冊的事件监听器,依据触发的事件类型分发给对应的事件监听器 事件对象(cc.Event) 包括事件相关信息的对象 怎样使用呢? 首先须要创建一个事件监听器.事件监听器包括下面几种类型: 触摸事件监听器 (cc.EventListener

浅谈Android 事件分发机制(一)

在上一篇文章中,浅谈Android 事件分发机制(一),简要分析了一下事件分发机制的原理,总结一下就是事件层层传递,直到被消费,原理看似简单,但是在实际使用过程中,场景各不相同,复杂程度也就因产品而异,这篇文章就通过给view加移动来模拟事件分发. 触摸事件 这里涉及到几个与手指触摸相关的常见事件: 坐标系对于单指触控移动来说,一次简单的交互流程是这样的:手指落下(ACTION_DOWN) -> 移动(ACTION_MOVE) -> 离开(ACTION_UP) 坐标系 Android坐标系以手