Python 防止matplotlib ginput注册单击小部件按钮

Python 防止matplotlib ginput注册单击小部件按钮,python,matplotlib,widget,ginput,Python,Matplotlib,Widget,Ginput,我已经编写了一个代码来注册在绘图窗口中单击的x值,它可以正常工作,并且只在您在窗口中单击时注册 然后,我想使用matplotlib小部件添加一些控制按钮,我做到了,而且它们在方法上也很好,到目前为止都很好 但是,我的问题是,当我点击按钮时,按钮的坐标也由ginput注册,这是我不想要的。有没有办法防止这种情况发生?使按钮区域对ginput无效,或者以某种方式检测并拒绝这些点击 我也很乐意使用ginput的替代方法,我并不是真的执着于任何特定的方法(我对python中的GUI非常陌生,只想建立一个

我已经编写了一个代码来注册在绘图窗口中单击的x值,它可以正常工作,并且只在您在窗口中单击时注册

然后,我想使用matplotlib小部件添加一些控制按钮,我做到了,而且它们在方法上也很好,到目前为止都很好

但是,我的问题是,当我点击按钮时,按钮的坐标也由ginput注册,这是我不想要的。有没有办法防止这种情况发生?使按钮区域对ginput无效,或者以某种方式检测并拒绝这些点击

我也很乐意使用ginput的替代方法,我并不是真的执着于任何特定的方法(我对python中的GUI非常陌生,只想建立一个简单的示例)

这是我的可复制示例,单击测试按钮也会将行添加到列表中:-(

示例的屏幕截图:

编辑:我现在想到了一个骗局,在button方法中,我添加了一个弹出按钮,从times列表中删除条目,并取消绘制行(我也将times和lines声明为全局),它可以工作,但它笨重且不太优雅,因为程序绘制了错误的行,然后再次删除,呃

# in the main code I now append the ax.axvline to a list "lines"
def test(self,event):
    times.pop()
        times.pop()
        lines.pop().remove()

避免该问题的一种方法不是使用按钮来终止输入,而是使用
ginput
功能(已描述)的
mouse\u stop
参数,该功能与鼠标按钮或回车键一起工作。
然后可以向绘图中添加文本以向用户显式显示此方法…互动性不如按钮,但它可以工作。

您可以执行
次。在回调中追加(nan)
,因此如果
次[-1]
nan
pop()
单击并忽略单击。在注册按钮事件时会有一些延迟,因此在检查
次[-1]
之前先暂停()

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.widgets导入按钮
时间=[]
#单击事件后,追加nan
类别索引:
def测试(自身、事件):
环球时报
times.append(np.nan)
打印(‘测试’)
图,ax=plt.子批次()
x=np.arange(30)
y=x**2
轴图(x,y)
回调=索引()
bax=图中添加轴([0.92,0.2,0.07,0.07])
按钮=按钮(bax,‘测试’,颜色为白色,悬停颜色为绿色)
按钮。单击时(callback.test)
尽管如此:
pts=plt.ginput(1)
#允许回调完成(可能需要调整持续时间)
plt.暂停(0.15)
#忽略最新元素是否为nan
如果时间和np.isnan(时间[-1]):
打印(f'忽略{times[-1]}')
泰晤士报
else:#否则存储并打印
timebegin=pts[0][0]
打印(f'添加{timebegin}')
times.append(timebegin)
ax.axvline(x=时间开始)
打印(f'times={times}')
plt.暂停(0.05)
# in the main code I now append the ax.axvline to a list "lines"
def test(self,event):
    times.pop()
        times.pop()
        lines.pop().remove()