我有两个版本的代码来添加/删除matplotlib图中的艺术家对象。第一个工作正常。我想通过将代码压缩为for循环来清理代码但是当我这样做时它不再正常工作。我想知道是否有一些简单的东西我可能会在这里失踪。
非循环版本(有效):
def on_motion(self,event):
if self.cback == 1:
print "Motion Registered"
self.xf, self.yf = event.xdata, event.ydata
if isinstance(self.axline, lines.Line2D):
self.ax.lines.remove(self.axline)
self.ax.lines.remove(self.bxline)
self.ax.lines.remove(self.ayline)
self.ax.lines.remove(self.byline)
self.canvas.draw()
self.pts = []
self.axline = lines.Line2D([self.xi, self.xf], [self.yf, self.yf])
self.bxline = lines.Line2D([self.xi, self.xf], [self.yi, self.yi])
self.ayline = lines.Line2D([self.xi, self.xi], [self.yi, self.yf])
self.byline = lines.Line2D([self.xf, self.xf], [self.yi, self.yf])
self.ax.add_line(self.axline)
self.ax.add_line(self.bxline)
self.ax.add_line(self.ayline)
self.ax.add_line(self.byline)
self.canvas.draw()
这是带有for循环的版本,但不起作用。当我运行此版本时,我会得到一个ValueError: list.remove(x): x not in list
,当self.ax.lines.remove(self.line[j])
行执行时会发生def on_motion(self,event):
if self.cback == 1:
print "Motion Registered"
self.xf, self.yf = event.xdata, event.ydata
if len(self.line) > 0 and isinstance(self.line[0], lines.Line2D):
for j in xrange(len(self.line)):
self.ax.lines.remove(self.line[j])
self.canvas.draw()
pt_matrix = [[self.xi, self.xf, self.yf, self.yf],
[self.xi, self.xf, self.yi, self.yi],
[self.xi, self.xi, self.yi, self.yf],
[self.xf, self.xf, self.yi, self.yf]]
linenew = []
for i in xrange(4):
linenew = lines.Line2D([pt_matrix[i][0], pt_matrix[i][1]], [pt_matrix[i][2], pt_matrix[i][3]])
self.line.append(linenew)
self.ax.add_line(self.line[i])
self.canvas.draw()
。奇怪的是,这个版本在暂停之前似乎适用于一些鼠标移动:
{{1}}