Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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 按'后缩放停止工作;1';按钮,但仅在子批次中_Python_Matplotlib - Fatal编程技术网

Python 按'后缩放停止工作;1';按钮,但仅在子批次中

Python 按'后缩放停止工作;1';按钮,但仅在子批次中,python,matplotlib,Python,Matplotlib,我正在开发一个简单的GUI,用它来分析一些数据。这在总体上效果很好,但在过去的几个小时里,我一直在为一些奇怪的错误挠头 下面的代码是我的真实应用程序的一个经过大量删减的版本。它的工作方式是,您可以通过鼠标左键和右键单击图像来添加和删除点。可通过按“0”和“1”键打开和关闭此“编辑模式” 当图像是唯一的子地块时,这可以正常工作。错误在于,如果图像是多个子批次中的一个子批次,Matplotlib的缩放按钮会在您打开编辑模式后立即停止工作(通过按下“1”按钮,该按钮将“点击”功能安装为按钮按下事件的处

我正在开发一个简单的GUI,用它来分析一些数据。这在总体上效果很好,但在过去的几个小时里,我一直在为一些奇怪的错误挠头

下面的代码是我的真实应用程序的一个经过大量删减的版本。它的工作方式是,您可以通过鼠标左键和右键单击图像来添加和删除点。可通过按“0”和“1”键打开和关闭此“编辑模式”

当图像是唯一的子地块时,这可以正常工作。错误在于,如果图像是多个子批次中的一个子批次,Matplotlib的缩放按钮会在您打开编辑模式后立即停止工作(通过按下“1”按钮,该按钮将“点击”功能安装为按钮按下事件的处理程序)。在此之后,按“o”或缩放按钮可更改光标,但缩放区域的矩形不再显示。我猜处理程序不知怎么弄乱了Matplotlib的内部结构

有人知道为什么缩放在单个子批次的情况下保持工作,但在多个子批次的情况下安装点击处理程序时停止工作吗?。要在工作版本和错误版本之间进行更改,请注释/取消注释生成图和子图的指示行。我正在使用python 2.7.14和matplotlib 2.2.2,这两个版本都来自anaconda

import numpy as np
import matplotlib.pyplot as plt

class Points(object):
    def __init__(self, ax):
        self.ax = ax

        # make dummy plot, points will be added later
        self.dots, = ax.plot([], [], '.r')
        self.x = []
        self.y = []

    def onclick(self, event):
        print 'point.onclick'
        # only handle clicks in the relevant axis
        if event.inaxes is not self.ax:
            print 'outside axis'
            return

        # add point with left button
        if event.button == 1:
            self.x.append(event.xdata)
            self.y.append(event.ydata)

        # delete point with right button
        if event.button == 3 and len(self.x) > 0:
            imn = np.argmin((event.xdata - self.x)**2 + (event.ydata - self.y)**2)
            del self.x[imn]
            del self.y[imn]

        self.dots.set_data(self.x, self.y)
        plt.draw()

#### THIS WORKS ####
fig, ax3 = plt.subplots()
####################

#### THIS DOES NOT WORK ####
# fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2)
############################

ax3.imshow(np.random.randn(10, 10))
ax3.set_title('Press 0/1 to disable/enable editing points')

points = Points(ax3)

# initial state
cid_click = None
state = 0

def on_key(event):
    global cid_click, state
    print 'you pressed %r' % event.key

    if event.key in '01':
        if cid_click is not None:
            print 'disconnect cid_click', cid_click
            fig.canvas.mpl_disconnect(cid_click)
            cid_click = None

        state = int(event.key)
        if state:
            print 'connect'
            cid_click = fig.canvas.mpl_connect('button_press_event', points.onclick)

    # plt.draw()
    print 'state = %i, cid = %s' % (state, cid_click)

cid_key = fig.canvas.mpl_connect('key_press_event', on_key)

plt.show()

这是迄今为止我遇到的最奇怪的错误之一。问题与按下1键有关。出于某种未知的原因,这似乎会终止对其他事件的回调。我创建了一个

目前,解决方案是不使用1键,而是使用a/d键(用于激活/停用)


感谢您进一步简化测试用例并提交错误报告。从这里可以看出,这似乎不是一个bug,而是一个(文档记录不良的)特性。似乎还可以使用“a”键重新启用所有轴的平移/缩放,这解决了我的问题。我唯一的问题是,用户自定义的键更少,我必须考虑其他选择。
# initial state
cid_click = None
state = "d"

def on_key(event):
    global cid_click, state
    print 'you pressed %r' % event.key

    if event.key in 'ad':
        if cid_click is not None:
            print 'disconnect cid_click', cid_click
            fig.canvas.mpl_disconnect(cid_click)
            cid_click = None

        state = event.key
        if state == "a":
            print 'connect'
            cid_click = fig.canvas.mpl_connect('button_press_event', points.onclick)

    print 'state = %s, cid = %s' % (state, cid_click)