'致命Python错误:PyEval_RestoreThread:NULL tstate'从Pyplot键按回调插入Tkinter列表框时

时间:2014-06-04 11:11:18

标签: python macos matplotlib listbox tkinter

我正在尝试从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

0 个答案:

没有答案