如何调试python del self.callbacks[s][cid] KeyError,而错误信息未指明代码中的具体位置
在我写的一个Python程序中,我遇到了一个错误,提示信息是:
Traceback (most recent call last):
File "/Applications/Canopy.app/appdata/canopy-1.4.0.1938.macosx- x86_64/Canopy.app/Contents/lib/python2.7/lib-tk/Tkinter.py", line 1470, in __call__
return self.func(*args)
File "/Users/lkloh/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.py", line 413, in button_release_event
FigureCanvasBase.button_release_event(self, x, y, num, guiEvent=event)
File "/Users/lkloh/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 1808, in button_release_event
self.callbacks.process(s, event)
File "/Users/lkloh/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/cbook.py", line 525, in process
del self.callbacks[s][cid]
KeyError: 103
你知道我该如何调试这个问题吗?或者可能出错的地方在哪里?这个错误信息并没有指向我自己写的代码的任何地方。我只有在关闭我的图形用户界面(GUI)窗口后才会看到这个错误信息,但我还是想修复它,尽管它并没有影响我代码的功能。
这个错误是我正在写的一个非常大的程序的一部分,所以我不能把所有的代码都发出来,但下面是我认为相关的代码:
def save(self, event):
self.getSaveAxes()
self.save_connect()
def getSaveAxes(self):
saveFigure = figure(figsize=(8,1))
saveFigure.clf()
# size of save buttons
rect_saveHeaders = [0.04,0.2,0.2,0.6]
rect_saveHeadersFilterParams = [0.28,0.2,0.2,0.6]
rect_saveHeadersOverride = [0.52,0.2,0.2,0.6]
rect_saveQuit = [0.76,0.2,0.2,0.6]
#initalize axes
saveAxs = {}
saveAxs['saveHeaders'] = saveFigure.add_axes(rect_saveHeaders)
saveAxs['saveHeadersFilterParams'] = saveFigure.add_axes(rect_saveHeadersFilterParams)
saveAxs['saveHeadersOverride'] = saveFigure.add_axes(rect_saveHeadersOverride)
saveAxs['saveQuit'] = saveFigure.add_axes(rect_saveQuit)
self.saveAxs = saveAxs
self.save_connect()
self.saveFigure = saveFigure
show()
def save_connect(self):
#set buttons
self.bn_saveHeaders = Button(self.saveAxs['saveHeaders'], 'Save\nHeaders\nOnly')
self.bn_saveHeadersFilterParams = Button(self.saveAxs['saveHeadersFilterParams'], 'Save Headers &\n Filter Parameters')
self.bn_saveHeadersOverride = Button(self.saveAxs['saveHeadersOverride'], 'Save Headers &\nOverride Data')
self.bn_saveQuit = Button(self.saveAxs['saveQuit'], 'Quit')
#connect buttons to functions they trigger
self.cid_saveHeaders = self.bn_saveHeaders.on_clicked(self.save_headers)
self.cid_savedHeadersFilterParams = self.bn_saveHeadersFilterParams.on_clicked(self.save_headers_filterParams)
self.cid_saveHeadersOverride = self.bn_saveHeadersOverride.on_clicked(self.save_headers_override)
self.cid_saveQuit = self.bn_saveQuit.on_clicked(self.save_quit)
def save_quit(self, event):
self.save_disconnect()
close()
1 个回答
0
我之前也遇到过同样的问题。看起来这是一个在某个库里的问题,特别是在一个叫做回调管理器的类里。在我的情况下,相关的文件位于这里:/usr/lib/pymodules/python2.7/matplotlib/cbook.py
def process(self, s, *args, **kwargs):
"""
process signal *s*. All of the functions registered to receive
callbacks on *s* will be called with *\*args* and *\*\*kwargs*
"""
if s in self.callbacks:
for cid, proxy in self.callbacks[s].items():
# Clean out dead references
if proxy.inst is not None and proxy.inst() is None:
if cid in self.callbacks[s]: #<------- here
del self.callbacks[s][cid]
else:
proxy(*args, **kwargs)