matplotlib事件处理基础(事件绑定、事件属性)


Posted in Python onFebruary 03, 2021

谈到用户界面交互总少不了事件,前面一系列文章介绍的鼠标光标、坐标、弹出式提示框等实现的底层其实都是事件处理,只不过matplotlib或其他包做了封装以便于应用。

matplotlib的事件处理模型基于GTK,matplotlib支持与wxpython、 tkinter、 qt、gtk等常见GUI后端的交互。

事件绑定

matplotlib的事件绑定有三个要素:

  • canvas对象
  • 事件名称
  • 回调函数

matplotlib的事件绑定由canvas对象调用mpl_connect方法实现,mpl_connect方法有两个参数:事件名称、回调函数。即canvas对象.mpl_connect(事件名称,回调函数)

mpl_connect方法又称为事件管理器,它是FigureCanvasBase类的方法。FigureCanvasBase类属于matplotlib.backend_bases模块,作用是隔离绘图和后端底层,这样绘图时就不用考虑各个后端之间的差异。

canvas原意画布,figure原意图像,可以这样理解,figure是一切可见绘图元素的集合,而canvas是figure的容器,canvas的事件的响应、处理都是基于canvas的。

下面通过一个案例来简单说明事件绑定的应用。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1,1])

def onclick(event):
  print('%s click: button=%d, x=%d, y=%d, xdata=%f, ydata=%f' %
     ('double' if event.dblclick else 'single', event.button,
      event.x, event.y, event.xdata, event.ydata))

cid = fig.canvas.mpl_connect('button_press_event', onclick)

plt.show()

运行后,在图像界面上单击鼠标,控制台会出现如下输出。

single click: button=1, x=123, y=80, xdata=0.222531, ydata=0.960511

在本案例中,fig为figure对象,fig的canvas属性可以返回当前图像所在的canvas对象,然后再调用mpl_connect方法,'button_press_event'为鼠标左键单击事件,onclick为回调函数。

事件

matplotlib中用到的事件类都继承自matplotlib.backend_bases.Event,主要事件如下表所示。

事件名称 描述
‘button_press_event' MouseEvent 鼠标按键被按下
‘button_release_event' MouseEvent 鼠标按键被释放
‘draw_event' DrawEvent 画布绘图
‘key_press_event' KeyEvent 键盘按键被按下
‘key_release_event' KeyEvent 键盘按键被释放
‘motion_notify_event' MouseEvent 鼠标移动
‘pick_event' PickEvent 画布中的对象被选中
‘resize_event' ResizeEvent 图形画布大小改变
‘scroll_event' MouseEvent 鼠标滚轮被滚动
‘figure_enter_event' LocationEvent 鼠标进入新的图形
‘figure_leave_event' LocationEvent 鼠标离开图形
‘axes_enter_event' LocationEvent 鼠标进入新的轴域
‘axes_leave_event' LocationEvent 鼠标离开轴域

事件属性

因为matplotlib中用到的事件类都继承自matplotlib.backend_bases.Event,所以所有事件都拥有以下3个共同属性。
name:事件名称。
canvas:生成事件的canvas对象。
guiEvent:触发matplotlib事件的GUI事件,默认为None。
所有事件均定义在matplotlib.backend_bases模块中,其中常用的鼠标事件MouseEvent、键盘事件KeyEvent都继承自LocationEvent事件。LocationEvent事件有5个属性。

  • x:x 位置,距离画布左端的像素数
  • y:y 位置,距离画布底端的像素数
  • inaxes:是否处于坐标系中,是则为鼠标所处于的子图实例,否则为None
  • xdata:鼠标的x坐标
  • ydata:鼠标的y坐标

键盘事件KeyEvent除继承自LocationEvent事件的5个属性外,还有1个key属性,表示按下的键,值范围为:None、任何字符、'shift'、win或者control。
鼠标事件MouseEvent 除继承自LocationEvent事件的5个属性外,还有以下属性

  • key:表示鼠标事件触发时按下的键,值范围同键盘事件KeyEvent中的key属性。
  • button:表示按下的鼠标按钮,值范围为:None、1、2、3、up、down(up、down用于滚动事件)。
  • dblclick:表示是否双击,布尔值。

鼠标事件案例

鼠标点击画线,将鼠标点击相邻两点用直线连接,起始点为0,0。

from matplotlib import pyplot as plt

class LineBuilder:
  def __init__(self, line):
    self.line = line
    self.xs = list(line.get_xdata())
    self.ys = list(line.get_ydata())
    self.cid = line.figure.canvas.mpl_connect('button_press_event', self)

  def __call__(self, event):
    print('click', event)
    if event.inaxes!=self.line.axes: return
    self.xs.append(event.xdata)
    self.ys.append(event.ydata)
    self.line.set_data(self.xs, self.ys)
    self.line.figure.canvas.draw()

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click to build line segments')
line, = ax.plot([0], [0]) # empty line
linebuilder = LineBuilder(line)

plt.show()

到此这篇关于matplotlib事件处理基础(事件绑定、事件属性)的文章就介绍到这了,更多相关matplotlib 事件处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
基于python的七种经典排序算法(推荐)
Dec 08 Python
Python操作SQLite数据库的方法详解
Jun 16 Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 Python
python socket网络编程之粘包问题详解
Apr 28 Python
对pandas replace函数的使用方法小结
May 18 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
pytorch permute维度转换方法
Dec 14 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
python实现LRU热点缓存及原理
Oct 29 Python
使用matplotlib动态刷新指定曲线实例
Apr 23 Python
python输出结果刷新及进度条的实现操作
Jul 13 Python
matplotlib相关系统目录获取方式小结
Feb 03 #Python
详解matplotlib绘图样式(style)初探
Feb 03 #Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 #Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 #Python
matplotlib更改窗口图标的方法示例
Feb 03 #Python
python中添加模块导入路径的方法
Feb 03 #Python
浅谈matplotlib默认字体设置探索
Feb 03 #Python
You might like
基于PHP创建Cookie数组的详解
2013/07/03 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
PHP使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
限制文本框输入N个字符的js代码
2010/05/13 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
python实现线程池的方法
2015/06/30 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
Python 复平面绘图实例
2019/11/21 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
Python 实现简单的客户端认证
2020/07/29 Python
python中pop()函数的语法与实例
2020/12/01 Python
html5 button autofocus 属性介绍及应用
2013/01/04 HTML / CSS
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
请说出以下代码输出什么
2013/08/30 面试题
会计电算化专业个人的自我评价
2013/11/24 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
管理工程专业求职信
2014/08/10 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
六个好看实用的 HTML + CSS 后台登录入口页面
2022/04/28 HTML / CSS
Go语言编译原理之变量捕获
2022/08/05 Golang