python实现事件驱动


Posted in Python onNovember 21, 2018

本文实例为大家分享了python实现事件驱动的具体代码,供大家参考,具体内容如下

EventManager事件管理类实现,大概就百来行代码左右。

# encoding: UTF-8
# 系统模块
from Queue import Queue, Empty
from threading import *
#################################################
class EventManager:
 #----------------------------------------------------------------------
 def __init__(self):
  """初始化事件管理器"""
  # 事件对象列表
  self.__eventQueue = Queue()
  # 事件管理器开关
  self.__active = False
  # 事件处理线程
  self.__thread = Thread(target = self.__Run)
 
  # 这里的__handlers是一个字典,用来保存对应的事件的响应函数
  # 其中每个键对应的值是一个列表,列表中保存了对该事件监听的响应函数,一对多
  self.__handlers = {}
 
 #----------------------------------------------------------------------
 def __Run(self):
  """引擎运行"""
  while self.__active == True:
   try:
    # 获取事件的阻塞时间设为1秒
    event = self.__eventQueue.get(block = True, timeout = 1) 
    self.__EventProcess(event)
   except Empty:
    pass
 
 #----------------------------------------------------------------------
 def __EventProcess(self, event):
  """处理事件"""
  # 检查是否存在对该事件进行监听的处理函数
  if event.type_ in self.__handlers:
   # 若存在,则按顺序将事件传递给处理函数执行
   for handler in self.__handlers[event.type_]:
    handler(event)
 
 #----------------------------------------------------------------------
 def Start(self):
  """启动"""
  # 将事件管理器设为启动
  self.__active = True
  # 启动事件处理线程
  self.__thread.start()
 
 #----------------------------------------------------------------------
 def Stop(self):
  """停止"""
  # 将事件管理器设为停止
  self.__active = False
  # 等待事件处理线程退出
  self.__thread.join()
 
 #----------------------------------------------------------------------
 def AddEventListener(self, type_, handler):
  """绑定事件和监听器处理函数"""
  # 尝试获取该事件类型对应的处理函数列表,若无则创建
  try:
   handlerList = self.__handlers[type_]
  except KeyError:
   handlerList = []
 
  self.__handlers[type_] = handlerList
  # 若要注册的处理器不在该事件的处理器列表中,则注册该事件
  if handler not in handlerList:
   handlerList.append(handler)
 
 #----------------------------------------------------------------------
 def RemoveEventListener(self, type_, handler):
  """移除监听器的处理函数"""
  #读者自己试着实现
 
 #----------------------------------------------------------------------
 def SendEvent(self, event):
  """发送事件,向事件队列中存入事件"""
  self.__eventQueue.put(event)
 
########################################################################
"""事件对象"""
class Event:
 def __init__(self, type_=None):
  self.type_ = type_  # 事件类型
  self.dict = {}   # 字典用于保存具体的事件数据

测试代码

#-------------------------------------------------------------------
# encoding: UTF-8
import sys
from datetime import datetime
from threading import *
from EventManager import *
 
#事件名称 新文章
EVENT_ARTICAL = "Event_Artical"
 
#事件源 公众号
class PublicAccounts:
 def __init__(self,eventManager):
  self.__eventManager = eventManager
 def WriteNewArtical(self):
  #事件对象,写了新文章
  event = Event(type_=EVENT_ARTICAL)
  event.dict["artical"] = u'如何写出更优雅的代码\n'
  #发送事件
  self.__eventManager.SendEvent(event)
  print u'公众号发送新文章\n'
 
#监听器 订阅者
class Listener:
 def __init__(self,username):
  self.__username = username
 
 #监听器的处理函数 读文章
 def ReadArtical(self,event):
  print(u'%s 收到新文章' % self.__username)
  print(u'正在阅读新文章内容:%s' % event.dict["artical"])
 
"""测试函数"""
#--------------------------------------------------------------------
def test():
 listner1 = Listener("thinkroom") #订阅者1
 listner2 = Listener("steve")#订阅者2
 
 eventManager = EventManager()
 
 #绑定事件和监听器响应函数(新文章)
 eventManager.AddEventListener(EVENT_ARTICAL, listner1.ReadArtical)
 eventManager.AddEventListener(EVENT_ARTICAL, listner2.ReadArtical)
 eventManager.Start()
 
 publicAcc = PublicAccounts(eventManager)
 timer = Timer(2, publicAcc.WriteNewArtical)
 timer.start()
 
if __name__ == '__main__':
 test()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python查找函数f(x)=0根的解决方法
May 07 Python
python通过openpyxl生成Excel文件的方法
May 12 Python
python的staticmethod与classmethod实现实例代码
Feb 11 Python
Python进阶之@property动态属性的实现
Apr 01 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
Python为何不能用可变对象作为默认参数的值
Jul 01 Python
python读写csv文件实例代码
Jul 05 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
Python-openpyxl表格读取写入的案例详解
Nov 02 Python
python 如何获取页面所有a标签下href的值
May 06 Python
Python类方法总结讲解
Jul 26 Python
python事件驱动event实现详解
Nov 21 #Python
python程序封装为win32服务的方法
Mar 07 #Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 #Python
pygame游戏之旅 添加游戏暂停功能
Nov 21 #Python
使用50行Python代码从零开始实现一个AI平衡小游戏
Nov 21 #Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 #Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 #Python
You might like
php循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
PHP设计模式之迭代器模式的深入解析
2013/06/13 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
php输出图像的方法实例分析
2017/02/16 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
jquery交替变换颜色的三种方法 实例代码
2013/11/19 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
python如何把嵌套列表转变成普通列表
2018/03/20 Python
wxpython绘制圆角窗体
2019/11/18 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
Moda Italia荷兰:意大利男士服装
2019/08/31 全球购物
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
土木工程师岗位职责
2013/11/24 职场文书
运动会领导邀请函
2014/02/05 职场文书
社会工作专业自荐信
2014/09/26 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
节水宣传标语口号
2015/12/26 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
python创建字典及相关管理操作
2022/04/13 Python