À l'aide de Matplotlib avec tkinter (TkAgg)

J'ai eu des problèmes constants de course Matplotlib avec tkinter. Ce qui se passe avec mon code, et avec les autres, y compris les exemples de code que j'ai téléchargé à partir du web, qui travaille probablement pour d'autres.

De l'utilisateur initial d'avertissement de matplotlib.use('TkAgg') se produit lorsque j'utilise le IPython de la console, mais pas le standard de Python console. Je pense que cela signifie IPython est plus détaillé, car dans les deux cas, le programme se bloque sur canvas.show(). Le code complet que j'ai essayé de courir est de la Matplotlib site web:

#!/usr/bin/env python
import matplotlib
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
# Implement the default mpl key bindings
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
import sys
if sys.version_info[0] < 3:
import Tkinter as Tk
else:
import tkinter as Tk
root = Tk.Tk()
root.wm_title("Embedding in TK")
f = Figure(figsize=(5, 4), dpi=100)
a = f.add_subplot(111)
t = arange(0.0, 3.0, 0.01)
s = sin(2*pi*t)
a.plot(t, s)
# A tk.DrawingArea
canvas = FigureCanvasTkAgg(f, master=root)
canvas.show()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
toolbar = NavigationToolbar2TkAgg(canvas, root)
toolbar.update()
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
def on_key_event(event):
print('you pressed %s' % event.key)
key_press_handler(event, canvas, toolbar)
canvas.mpl_connect('key_press_event', on_key_event)
def _quit():
root.quit()     # Stops mainloop
root.destroy()  # This is necessary on Windows to prevent
# Fatal Python Error: PyEval_RestoreThread: NULL tstate
button = Tk.Button(master=root, text='Quit', command=_quit)
button.pack(side=Tk.BOTTOM)
Tk.mainloop()
# If you put root.destroy() here, it will cause an error if
# the window is closed with the window manager.

De l'utilisation du débogueur j'ai suivi la toile.dans tkinter (backend_tkagg.py):

def draw(self):
FigureCanvasAgg.draw(self)
tkagg.blit(self._tkphoto, self.renderer._renderer, colormode=2)
self._master.update_idletasks()

J'enjambe FigureCanvasAgg.tirage sur ok et entrez dans tkagg.blit... avis aucune des données transmises à tkagg.blit est les données de l'application. Cet appel me prend pour tkagg.py, à savoir:

def blit(photoimage, aggimage, bbox=None, colormode=1):
tk = photoimage.tk
if bbox is not None:
bbox_array = bbox.__array__()
else:
bbox_array = None
data = np.asarray(aggimage)
try:
tk.call("PyAggImagePhoto", photoimage,
id(data), colormode, id(bbox_array))
except Tk.TclError:
try:
try:
_tkagg.tkinit(tk.interpaddr(), 1)
except AttributeError:
_tkagg.tkinit(id(tk), 0)
tk.call("PyAggImagePhoto", photoimage,
id(data), colormode, id(bbox_array))
except (ImportError, AttributeError, Tk.TclError):
raise

où il échoue à plusieurs reprises sur les savoirs traditionnels.d'appel, qui, je pense, est un appel en Tcl.

J'ai modifié le code ici pour attirer l'TclError comme une variable afin que je puisse l'inspecter dans le débogueur. Il a dit: tclErr: invalid command name "PyAggImagePhoto"

Que dois-je faire de cela?

Pouvez-vous donner un exemple minimal? Ma conjecture est que vous êtes à l'aide de ipython avec --pylab? ?
Je suis à l'aide de ipython, mais ne précise pas --pylab. Cependant je l'ai essayé en standard de python console, et ne bénéficient pas de l'avertissement à l'utilisateur. Néanmoins, ils ont tous deux crash sur un appel à la toile.spectacle. BTW, je suis en utilisant tkinter 8.6. Dans le débogueur, j'ai trouvé que c'est un appel interne en tkagg.py, appelé à partir de backend_tkagg.py à l'aide de ses propres données et non la mienne. Il échoue sur un appel à tcl lorsque vous tentez d'afficher son image bitmap, j'.e son d'un appel à un blit méthode dans les deux cas... le backend version de l'appel de la tkagg version qui appelle tcl
Pourriez-vous s'il vous plaît poster réel de l'exécution de code? Merci de lire Comment faire pour créer un Minimum, Complète et Vérifiable Exemple
J'ai ajouté le code complet... c'est un exemple de la matplotlib site web.
D'un problème avec l'Anaconda 3 distribution... voir groups.google.com/a/continuum.io/forum/#!topic/anaconda/... pour une discussion approfondie. La réponse courte est de ne pas utiliser TkAgg utiliser la valeur par défaut QtAgg , et matplotlib.pyplot.

OriginalL'auteur r mosher | 2016-03-06