matplotlib如何对事件处理器建立多个连接?
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
。我尝试过使用 GTKAgg
和 TkAgg
后端,结果都是一样。使用python和ipython,无论有没有 -wthread -pylab
,或者 ipython qtconsole --pylab=inline
,都没有区别。我得到的连接ID是 cid0 == cid1 == 6
。
补充2:我的问题在今天仍然存在,使用的matplotlib版本是 1.2.x
和 TkAgg
后端, 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 调用被忽略