Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将“mpl_connect”限制为“axes”而不是整个“figure”?_Python_Performance_Matplotlib_Widget_Interactive - Fatal编程技术网

Python 如何将“mpl_connect”限制为“axes”而不是整个“figure”?

Python 如何将“mpl_connect”限制为“axes”而不是整个“figure”?,python,performance,matplotlib,widget,interactive,Python,Performance,Matplotlib,Widget,Interactive,我正在编写一个程序,用户可以在其中交互修改绘图。我正在使用3个mpl\u connect功能(key\u press\u eventbutton\u press\u eventbutton\u release\u event)和4个文本框(mwidgets.TextBox) 每次我在文本框中键入文本时,过程都很慢,我认为这是因为当我单击并写入文本框时,它会触发3个“mpl连接”(key\u press\u eventbutton\u press\u eventbutton\u release\u

我正在编写一个程序,用户可以在其中交互修改绘图。我正在使用3个
mpl\u connect
功能(
key\u press\u event
button\u press\u event
button\u release\u event
)和4个文本框(
mwidgets.TextBox

每次我在文本框中键入文本时,过程都很慢,我认为这是因为当我单击并写入文本框时,它会触发3个“mpl连接”(
key\u press\u event
button\u press\u event
button\u release\u event

3个文本框位于“axis对象”之外,因此我想知道是否有办法将“mpl连接”限制为仅在感兴趣的轴内。也就是说,不要对以下内容进行编码:

cid1 = figure.canvas.mpl_connect('key_press_event', onPressKey)
cid2 = figure.canvas.mpl_connect('button_press_event', onPressButton)
cid3 = figure.canvas.mpl_connect('button_release_event', onReleaseButton)
要编写类似以下内容的代码(请注意,
canvas
替换了
axes
):

有解决办法吗


欢迎评论

看看这个简单的例子,看看
print
语句返回什么:

将numpy导入为np
将matplotlib导入为mpl
将matplotlib.pyplot作为plt导入
从matplotlib.widgets导入文本框
图,ax=plt.子批次()
plt.子批次调整(底部=0.2)
t=np.arange(-2.0,2.0,0.001)
s=t**2
首字母\u text=“t**2”
l、 =plt.绘图(t,s,lw=2)
def提交(文本):
ydata=eval(文本)
l、 设置数据(ydata)
最大设定值(np.min(ydata),np.max(ydata))
plt.draw()
def onPressKey(事件):
打印('您在ax{1}中按了{0}'。格式(event.key,event.inaxes))
如果[ax]中的event.inaxes:
打印(“在ax中”)
[fig.axes[1]]中的elif event.inaxes:
打印(“在cid1中”)
其他:
打印(“外部”)
axbox=plt.轴([0.1,0.05,0.8,0.075])
文本框=文本框(axbox,'评估',初始值=初始文本)
文本框。关于提交(提交)
图canvas.mpl\u connect('key\u press\u event',onPressKey)
plt.show()
如果将鼠标悬停在“绘图区域”(即
ax
,或
fig.axes[0]
)上,则按下的每个键都将触发默认键绑定(i.s.s触发保存对话框)

onPressKey(event)
处理程序已经可以用来决定如何处理此输入,因为它知道
事件。在axes
,即在
按键事件期间鼠标所在的位置。
但是,请注意,一旦您在
文本框
小部件中单击,它将捕获您的输入(即s写入其中,不会触发保存对话框)。 如果您现在将鼠标移到文本框之外,则在文本输入期间,
onPressKey(event)
处理程序仍会让您知道鼠标在
ax
之内(或者可能在“外部”),但这不会改变
TextBox
小部件仍然捕获您的输入的事实,直到您按enter键


简短的回答:您不想将
按键事件
连接到特定的轴,而是想让
onPressKey(event)
处理程序很好地处理它。每次击键都应注册为一个按键按下事件,因此这可能不是您的罪魁祸首(除非您的实际代码设置为在e键按下时进行一些昂贵的计算,并且您忘记先单击
文本框内的
按钮)。

据我所知,这是不可能的,但是您没有为功能
onPressKey
和其他功能提供代码。您是否可以测试哪个Axis对象触发了事件,如果不是绘图对象,则立即返回?您写道,您“认为这是因为当我单击并写入文本框时,它不必要地触发了3”mpl连接“@DizietAsahi-功能
onPressKey
onPressButton
onReleaseButton
仅返回按下的键盘键或鼠标键的值,实际上是立即返回@阿斯莫斯-是的,我已经按照你说的核实过了。当我在文本框上键入时,功能
onPressKey
正在打印每个输入的字符,这是不必要的,因为我仅在将鼠标悬停在包含打印的轴上时使用按下的键盘键的值。
cid1 = figure.axes.mpl_connect('key_press_event', onPressKey)
cid2 = figure.axes.mpl_connect('button_press_event', onPressButton)
cid3 = figure.axes.mpl_connect('button_release_event', onReleaseButton)