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实现划词翻译
Apr 23 Python
Python编写的com组件发生R6034错误的原因与解决办法
Apr 01 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
详解Python多线程下的list
Jul 03 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
Dec 10 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 Python
字典算法实现及操作 --python(实用)
Mar 31 Python
Python借助with语句实现代码段只执行有限次
Mar 23 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
UCenter Home二次开发指南
2009/05/28 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
初步解析Python下的多进程编程
2015/04/28 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
python实现遍历文件夹图片并重命名
2020/03/23 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
应用电子专业学生的自我评价
2013/10/16 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
工作简报格式范文
2015/07/21 职场文书
2016年少先队活动总结
2016/04/06 职场文书
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript