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处理圆角图片、圆形图片的例子
Apr 25 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
python实现转圈打印矩阵
Mar 02 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
Python的in,is和id函数代码实例
Apr 18 Python
完美解决ARIMA模型中plot_acf画不出图的问题
Jun 04 Python
Python json格式化打印实现过程解析
Jul 21 Python
Python实现播放和录制声音的功能
Aug 12 Python
用Python远程登陆服务器的步骤
Apr 16 Python
Python Numpy之linspace用法说明
Apr 17 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下载远程文件类(支持断点续传)
2008/11/14 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
php中hashtable实现示例分享
2014/02/13 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
PHP 断点续传实例详解
2017/11/11 PHP
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
js实现时间日期校验
2020/05/26 Javascript
VUE+Element实现增删改查的示例源码
2020/11/23 Vue.js
详细解读Python中解析XML数据的方法
2015/10/15 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python斐波那契数列的计算方法
2018/09/27 Python
浅析python 字典嵌套
2020/09/29 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
恶意软件的定义
2014/11/12 面试题
成品仓管员工作职责
2013/12/29 职场文书
海南地接欢迎词
2014/01/14 职场文书
办理生育手续介绍信
2014/01/14 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
土木工程求职信
2014/05/29 职场文书
孔庙导游词
2015/02/04 职场文书
学历证明范文
2015/06/16 职场文书
如何写观后感
2015/06/19 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书