2012-02-17 19 views
2

データ+ a(matplotlib)スライダウィジェットを含む複数のmatplotlibキャンバスを使用したいと思います。Python 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は、他のすべての組み合わせを動作しないでください: 問題は、これは私が持っているものである

(マウスイベントが送信されたり、何かされていないように見える)スライダウィジェットが正しく更新されていないということです(テストスクリプトatleast、私のアプリケーションでは、別の場所にスライダウィジェットを作成しても動作しません。 スライダはマウスイベントに反応しません.....

私は何が欠けていますか?

答えて

2

スクリプトを自分のマシンで実行するには、以下の変更を加えなければなりませんでした。私はオプション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() 

hereもフィギュアとshowコマンドと同じスコープでそれを作成します。あなたは、あなたがその関数は、関数の外スコープに戻ってスライダーを返すよう関数にスライダーの作成を移動add_slider return sの最後の行として追加して、変更したい場合は

w.add_slider()s = w.add_slider()

かキャンバスと同じスコープ(クラスメンバ)に関連性を格納することができます。例えば、self.slider = Slider(a, 'range', 0.1, 30.0, valinit=5)のようになります。

option = 1の場合、これらの方法はどちらもマウスイベントでスライダを更新します。

+0

私はそれが何かシンプルでなければならないことを知っていましたが、あなたは正式に私のヒーローです! – Jori

関連する問題