Python Matplotlib slider widget no se está actualizando

Quiero usar múltiples encuestas de matplotlib que contengan datos + un widget de control deslizante (matplotlib). el problema es que los controles deslizantes no se actualizan correctamente (parece que los eventos del mouse no se han enviado o algo así)

Esto es lo que tengo:

import matplotlib matplotlib.use('TkAgg') from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure from matplotlib.widgets import Slider class PlotWidget( Tk.Frame ): def __init__(self, master): Tk.Frame.__init__(self, master) self.figure = Figure(figsize=(5,4), dpi=75) self.canvas = FigureCanvasTkAgg(self.figure, self) self.frame = self.canvas.get_tk_widget() self.frame.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) self.canvas.show() def add_slider(self): a = self.figure.add_axes([0.25, 0.1, 0.65, 0.03], axisbg='lightgoldenrodyellow') s = Slider( a, 'range', 0.1, 30.0, valinit=5) self.canvas.show() root = Tk.Tk() option = 1 if option == 1 or option = 2: w = PlotWidget(root) w.pack() figure = w.figure else: f = Tk.Frame(root, bd = 6, bg='red') figure = matplotlib.figure.Figure(figsize=(5,4), dpi=75) canvas = FigureCanvasTkAgg(figure, f) canvas.get_tk_widget().pack() canvas.show() f.pack() if option = 1: w.add_slider() else: a = figure.add_axes([0.25, 0.1, 0.65, 0.03], axisbg='lightgoldenrodyellow') s = Slider( a, 'range', 0.1, 30.0, valinit=5) Tk.mainloop() 

la opción 1 no funciona con todas las demás combinaciones (en el guión de prueba al menos, en mi aplicación tampoco funciona cuando creo el widget del control deslizante en otra ubicación. El control deslizante no reactjs en los eventos del mouse …

¡¿Qué me estoy perdiendo?!

    Tuve que hacer los siguientes cambios para que su script se ejecute en mi máquina.

     import matplotlib from Tkinter import * matplotlib.use('TkAgg') from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure from matplotlib.widgets import Slider class PlotWidget( Frame ): def __init__(self, master): Frame.__init__(self, master) self.figure = Figure(figsize=(5,4), dpi=75) self.canvas = FigureCanvasTkAgg(self.figure, self) self.frame = self.canvas.get_tk_widget() self.frame.pack(side=TOP, fill=BOTH, expand=1) self.canvas.show() def add_slider(self): a = self.figure.add_axes([0.25, 0.1, 0.65, 0.03], axisbg='lightgoldenrodyellow') s = Slider( a, 'range', 0.1, 30.0, valinit=5) self.canvas.show() root = Tk() option = 1 if option == 1 or option == 2: w = PlotWidget(root) w.pack() figure = w.figure else: f = Frame(root, bd = 6, bg='red') figure = matplotlib.figure.Figure(figsize=(5,4), dpi=75) canvas = FigureCanvasTkAgg(figure, f) canvas.get_tk_widget().pack() canvas.show() f.pack() if option == 1: w.add_slider() else: a = figure.add_axes([0.25, 0.1, 0.65, 0.03], axisbg='lightgoldenrodyellow') s = Slider( a, 'range', 0.1, 30.0, valinit=5) root.mainloop() 

    Creo que la opción 1 no funciona debido al scope en el que se está creando el control deslizante.

    El ejemplo aquí también lo crea en el mismo scope que la figura y los comandos show.

    Si desea mover la creación del Control deslizante a una función, dicha función devuelve el Control deslizante al ámbito fuera de la función, agregue como la última línea de return s add_slider return s luego cambie w.add_slider() a s = w.add_slider()

    o puede almacenar los datos relevantes en el mismo ámbito (miembro de clase) como canvas y figura, por ejemplo, self.slider = Slider( a, 'range', 0.1, 30.0, valinit=5) .

    Ambos métodos hacen que el control deslizante se actualice en el evento del mouse cuando option = 1 .