我正在尝试从Pylab绘图更新Tkinter列表框中的按键事件。回调工作正常,但当我插入列表框时,我得到标题中的错误。我还有一个来自Tkinter窗口的按键回调,它使用相同的功能更新列表框而没有错误。即。只有当事件来自Matplotlib回调时才会发生错误。
以下是相关(简化)代码。
import matplotlib.pyplot as plt
import Tkinter as Tk
class Tkinter_GUI(Tk.Frame):
def __init__(self, parent):
#...
self.graph = Graph(data, self.on_key_press_event)
#...
self.listbox = Tk.Listbox(parent)
self.listbox.grid()
#...
parent.bind("<Key>", self.on_key_press) # Key press callback from Tkinter
def on_key_press_event(self, event):
try:
char = event.char # If the event came from Tkinter
except AttributeError:
char = event.key # If the event came from Pyplot
listbox_items = f(char)
self.listbox.insert(Tk, *listbox_items) # This line causes the error, but only when called by the Graph callback.
class Graph():
def __init__(self, data, key_press_callback):
self.key_press_callback = key_press_callback
#...
plt.ion()
self.fig = plt.figure()
self.fig.canvas.mpl_connect('key_press_event', self.key_press_callback)
# plot data ...
if __name__ == '__main__':
root = Tk.Tk()
window = Tkinter_GUI(root)
root.mainloop()
注释掉列表框插入行可以防止错误。
我怀疑它可能是Tkinter和Matplotlib之间的某种不良互动。我的谷歌搜索已经发现了一些相关的问题(例如this)但没有解决方案。
我在OSX Mavericks上使用Enthought Python。我附上了Apple系统报告/ Python崩溃转储,以防任何有用的细节可能在里面:http://pastebin.com/SqY9GN3C