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抓取Discuz!用户名脚本代码
Dec 30 Python
python动态加载变量示例分享
Feb 17 Python
Python lambda和Python def区别分析
Nov 30 Python
python使用电子邮件模块smtplib的方法
Aug 28 Python
详解Python开发中如何使用Hook技巧
Nov 01 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
PyQt5每天必学之QSplitter实现窗口分隔
Apr 19 Python
对python 命令的-u参数详解
Dec 03 Python
Python创建字典的八种方式
Feb 27 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
Django自带的用户验证系统实现
Dec 18 Python
Python 中 Shutil 模块详情
Nov 11 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
国内咖啡文化
2021/03/03 咖啡文化
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
2017/06/09 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
JS使用正则表达式验证身份证号码
2017/06/23 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
中东奢侈品市场:Coveti
2019/05/12 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
精彩的大学生自我评价
2013/11/17 职场文书
早读迟到检讨书
2014/01/24 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
求职自我推荐信
2015/03/24 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
导游词之襄阳古城
2019/09/27 职场文书