python模拟事件触发机制详解


Posted in Python onJanuary 19, 2018

本文实例为大家分享了python模拟事件触发机制的具体代码,供大家参考,具体内容如下

EventManager.py

# -*- 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 = {}     # 字典用于保存具体的事件数据

test.py

# -*- encoding: UTF-8 -*-

from threading import *
from EventManager import *
import time

#事件名称 新文章
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'公众号发送新文章')


#监听器 订阅者
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)
  while True:
    publicAcc.WriteNewArtical()
    time.sleep(2)

if __name__ == '__main__':
  test()

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

Python 相关文章推荐
Python循环语句之break与continue的用法
Oct 14 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
简单实现python进度条脚本
Dec 18 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
Django中使用Celery的教程详解
Aug 24 Python
python实现一个简单的ping工具方法
Jan 31 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 Python
python3.9之你应该知道的新特性详解
Apr 29 Python
python基础之文件处理知识总结
May 23 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 #Python
简单谈谈python中的lambda表达式
Jan 19 #Python
python使用logging模块发送邮件代码示例
Jan 18 #Python
zookeeper python接口实例详解
Jan 18 #Python
Python获取当前函数名称方法实例分享
Jan 18 #Python
Python AES加密实例解析
Jan 18 #Python
快速了解python leveldb
Jan 18 #Python
You might like
php md5下16位和32位的实现代码
2008/04/09 PHP
PHP四大安全策略
2014/03/12 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
JavaScript this 深入理解
2009/07/30 Javascript
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
移动节点的jquery代码
2014/01/13 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
Javascript 中创建自定义对象的方法汇总
2014/12/04 Javascript
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
理解javascript正则表达式
2016/03/08 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
ES6数组的扩展详解
2017/04/25 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
Python中的super()方法使用简介
2015/08/14 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
大学生收银员求职信分享
2014/01/02 职场文书
电钳工人个人求职信
2014/05/10 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫