matplotlib如何对事件处理器建立多个连接?

11 投票
2 回答
3085 浏览
提问于 2025-04-16 22:38
import sys
import matplotlib
import matplotlib.pyplot as plt
print matplotlib.__version__, matplotlib.get_backend()

def hit(event):
  sys.stderr.write('hit\n')

fig = plt.figure()
cid0 = fig.canvas.mpl_connect('key_press_event', hit)
cid1 = fig.canvas.mpl_connect('button_press_event', hit)
print cid0, cid1
plt.show()

根据上面的代码,为什么我不能同时让鼠标按下事件和键盘按下事件都能触发呢?看起来在上面的顺序中,只有键盘按下事件有效;而如果我把第10行和第11行的顺序调换一下(也就是cid0和cid1的赋值顺序),那么只有鼠标事件有效。也就是说,无论我先连接哪个事件,那个事件就会占用事件处理器。这个是matplotlib的内置限制,还是我连接多个事件的方式不对呢?

补充信息:我的 matplotlib.__version__1.1.0。我尝试过使用 GTKAggTkAgg 后端,结果都是一样。使用python和ipython,无论有没有 -wthread -pylab,或者 ipython qtconsole --pylab=inline,都没有区别。我得到的连接ID是 cid0 == cid1 == 6

补充2:我的问题在今天仍然存在,使用的matplotlib版本是 1.2.xTkAgg 后端, sys.version 2.7.2+ (default, Oct 4 2011, 20:06:09) [GCC 4.6.1]

2 个回答

0

我试了你的代码,鼠标和键盘的操作都有效:我每次都能“击中”。

我用的是ubuntu 10.10,python 2.6.6和matplotlib 0.99.3,都是通过synaptic安装的(不是下载最新版本然后运行setup.py,因为之前这样做让我遇到过很多大问题)。

我还安装了python2.6-dev,因为这通常会添加缺失的“.h”头文件。

希望这能帮到你。

4

我觉得你遇到了这个问题:多个 mpl_connect 调用被忽略

撰写回答