Python Matplotlib滑块小部件未更新

Python Matplotlib滑块小部件未更新,python,slider,matplotlib,Python,Slider,Matplotlib,我想使用多个matplotlib画布,其中包含数据+一个(matplotlib)滑块小部件。 问题是滑块小部件没有正确更新(看起来好像没有发送鼠标事件之类的) 这就是我所拥有的: import matplotlib matplotlib.use('TkAgg') from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure from matplotlib.

我想使用多个matplotlib画布,其中包含数据+一个(matplotlib)滑块小部件。 问题是滑块小部件没有正确更新(看起来好像没有发送鼠标事件之类的)

这就是我所拥有的:

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()
选项1不适用于所有其他组合(至少在测试脚本中,在我的应用程序中,当我在另一个位置创建滑块小部件时,它也不适用)。 滑块不会对鼠标事件做出反应


我遗漏了什么?!

我必须做以下更改才能让您的脚本在我的机器上运行

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()
我认为选项1不起作用,因为滑块是在其中创建的

该示例还在与figure和show命令相同的范围内创建它

如果要将滑块创建移动到一个函数中,您可以让该函数将滑块返回到函数外部的作用域中,添加为添加滑块
返回s
的最后一行,然后将
w.add\u Slider()
更改为
s=w.add\u Slider()

或者,您可以将相关数据存储在与画布和图相同的范围(类成员)中,例如
self.slider=slider(a'range',0.1,30.0,valinit=5)


option=1
时,这两种方法都会使滑块在鼠标事件时更新,我知道这必须是简单的事情,但你现在正式成为我的英雄!