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 冒泡,选择,插入排序使用实例
Feb 05 Python
Python import自定义模块方法
Feb 12 Python
Python中的__SLOTS__属性使用示例
Feb 18 Python
Python爬取十篇新闻统计TF-IDF
Jan 03 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
提升python处理速度原理及方法实例
Dec 25 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
python字典进行运算原理及实例分享
Aug 02 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
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
javascript引用对象的方法代码
2007/08/13 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
javascript求日期差的方法
2016/03/02 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
python的Template使用指南
2014/09/11 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
Python处理文本换行符实例代码
2018/02/03 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
职业教育毕业生求职信
2013/11/09 职场文书
中学生在校期间的自我评价分享
2013/11/13 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技