【问题标题】:matplotlib multiple connections to an event handler?matplotlib 到事件处理程序的多个连接?
【发布时间】:2011-10-17 04:27:54
【问题描述】:
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 分配),那么只有鼠标事件起作用。 IE。无论我先连接哪个,都会占用事件处理程序。这是 matplotlib 的内置限制,还是我试图以错误的方式连接多个事件?

编辑一些额外的信息:我的matplotlib.__version__1.1.0。我曾尝试使用GTKAggTkAgg 后端,结果相同。使用 python 和 ipython,不管有没有 -wthread -pylabipython qtconsole --pylab=inline,都没有区别。我得到的连接 ID 是cid0 == cid1 == 6

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

【问题讨论】:

  • 您的代码对我来说很好用。我已经尝试过使用“ipython -pylab”,然后是“run yourcode”和“python yourcode.py”——干杯。我想我正在使用 GTK 后端,但我不确定。你在什么条件下跑步?
  • 有趣。你能告诉我你的sys.versionmatplotlib.backends.backend和你的matplotlib.__version__吗?
  • 对于我来说也很好用(都打印hit),使用2.6.5 (r265:79063, Apr 16 2010, 13:57:41) [GCC 4.4.3],Matplotlib 版本0.99.1.1TkAgg 作为默认后端。
  • 我错了,肯定不是 GTK 后端。 sys.version => " 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) \n [GCC 4.4.5]" matplotlib.backends.backend => TkAgg matplotlib.__version__ => '0.99.3 '
  • 我注意到cid0 == cid1,闻起来很有趣。如果我使用hit_ = lambda x: hit(x),然后将其中一个连接到hit_,我会得到cid0 != cid1,并且事件处理程序会按预期为两个用例触发。这是我将使用的当前解决方法,但如果有人能找到问题的根本原因,我很想听听,谢谢!

标签: python events event-handling matplotlib


【解决方案1】:

我试过你的代码,两个动作(鼠标和键盘)都成功了:我每次都“击中”。

我使用 ubuntu 10.10、python 2.6.6 和 matplotlib 0.99.3,全部由 synaptic 安装(不是通过下载最新版本并运行 setup.py,因为这导致我之前遇到了几个大问题)。

我还安装了 python2.6-dev,因为这在大多数情况下会添加缺少的“.h”标头。

希望这会有所帮助。​

【讨论】:

  • 是的,我以前在突触版本中使用过它。
  • 您使用的是哪个后端?我主要有明确的后端导入,例如: from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as Canvas 但未指定时,您使用文件中的默认值:/home/project29/.matplotlib/.matplotlibrc 后端:GTKAgg
  • (为时已晚,无法完成之前的编辑)- 也请查看 matplotlib.sourceforge.net/users/customizing.html
  • 它在问题下的 cmets 中说明,我有 GTKAgg 后端。但我已经尝试过其他的,我也有 TkAgg 后端的问题。
  • 我有 cid=6 键和 cid=7 鼠标 - 0.99.3 TkAgg 6 7 hit hit
【解决方案2】:

我想你偶然发现了这个错误:Multiple mpl_connect calls ignored

【讨论】:

  • 谢谢。最近升级到1.3.x,bug已经修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多