Виджет слайдера Python Matplotlib не обновляется - PullRequest
2 голосов
/ 18 февраля 2012

Я хочу использовать несколько полотен 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 не работает, все остальные комбинации работают (в тестовом сценарии по крайней мере, в моем приложении она также не работает, когда я создаю виджет слайдера в другом месте ползунок не реагирует на события мыши .....

что мне не хватает?!

1 Ответ

2 голосов
/ 18 февраля 2012

Мне пришлось внести следующие изменения, чтобы ваш скрипт работал на моей машине.

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.

Если вы хотите переместить создание Slider в функцию, у вас есть эта функция, верните Slider обратно в область за пределами функции, добавьте в качестве последней строки add_slider return s и затем измените w.add_slider() на s = w.add_slider()

или вы можете хранить релевантные данные в той же области видимости (член класса), что и холст и рисунок, например, self.slider = Slider( a, 'range', 0.1, 30.0, valinit=5).

Оба эти метода обновляют ползунок при событии мыши, когда option = 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...