我正在编写一个程序,用户可以在其中交互地修改绘图。我正在使用3个mpl_connect
函数(key_press_event
button_press_event
button_release_event
)和4个文本框(mwidgets.TextBox
)。
每次我在文本框中键入文本时,过程都很缓慢,我认为这是因为当我单击并在文本框中书写时,它不必要会触发3个“ mpl连接”( key_press_event
button_press_event
button_release_event
)。
这3个文本框在“轴对象”的外部,因此我想知道是否有一种方法可以将“ 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
)
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)
有一些解决方法吗?
欢迎任何评论!
答案 0 :(得分:1)
看看这个简单的例子,看看print
语句返回什么:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.widgets import TextBox
fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.2)
t = np.arange(-2.0, 2.0, 0.001)
s = t ** 2
initial_text = "t ** 2"
l, = plt.plot(t, s, lw=2)
def submit(text):
ydata = eval(text)
l.set_ydata(ydata)
ax.set_ylim(np.min(ydata), np.max(ydata))
plt.draw()
def onPressKey(event):
print('you pressed key {0} in ax {1}'.format( event.key, event.inaxes ))
if event.inaxes in [ax]:
print("in ax")
elif event.inaxes in [fig.axes[1]]:
print("in cid1")
else:
print("outside")
axbox = plt.axes([0.1, 0.05, 0.8, 0.075])
text_box = TextBox(axbox, 'Evaluate', initial=initial_text)
text_box.on_submit(submit)
fig.canvas.mpl_connect('key_press_event', onPressKey)
plt.show()
如果将鼠标悬停在“绘图区域”(即ax
或fig.axes[0]
)上,则您按下的每个键都会触发默认的键绑定(是 s 触发器)保存对话框)。
onPressKey(event)
处理程序已经可以用来决定如何处理此输入,因为它知道event.inaxes
,即key_press_event
期间鼠标在哪里。
但是请注意,一旦在TextBox
小部件内单击,它将捕获您的输入(即在其中写入 s ,不会触发保存对话框)。
如果现在将鼠标移出texbox 之外,onPressKey(event)
处理程序仍会告知您鼠标在文本输入过程中位于ax
内(或“外部”),但这不会改变{em {1}}小部件仍会捕获您的输入的事实,直到您例如按输入。
简短答案::您不想将TextBox
连接到特定轴,而是想让key_press_event
处理程序,以及处理它。每个击键都应注册为一个key_press_event ,因此这可能不是您的罪魁祸首(好吧,除非您将实际代码设置为例如对键 e进行一些昂贵的计算,然后您已经忘记了首先在onPressKey(event)
内单击。)