0

ユーザー入力に基づいてデータを表示し、インタラクティブに処理する WX-MPL アプリに取り組んでいます。WX アプリ内で動作するように MPL マウス イベントを設定するのに問題があります。

目標は、以前の処理で識別されたフィーチャの開始時間と終了時間を示す一連の編集可能な垂直線を作成することです。ユーザーは、x 軸に沿って線をドラッグしたり、不要な線を削除したり、新しい線を挿入したりできる必要があります。

これまでのところ、標準の MPL プロット図 (Tk だと思います) を使用してこの機能を実現できました。これらのクラスを自分のアプリに統合しようとすると、イベント処理で何かがおかしくなり、ライン オブジェクトを操作したり、新しいライン オブジェクトを作成したりできなくなります。そのため、私はステップをバックアップし、実際の例に複雑さを加えて、問題がどこにあるのかを判断しようとしました。

作業例を単純な WX アプリとして実行すると、NewVLineListener クラスは button_press_events を受信しないように見えます。以下は、私が経験している特定の問題に関連するコードです。

マウスイベントを扱ったのはこれが初めてで、何かが欠けているに違いありません...アドバイスをいただければ幸いです。

また、WX 2.8.12 と MPL 1.1.1rc を実行しています。

from matplotlib.figure import Figure
import wx
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg

class NewVLineListener:
    global castLog, count, dvls, ax1
    lock = None  # only one can be animated at a time
    def __init__(self, fig):
        self.fig = fig

    def connect(self):
        'connect to all the events we need'
        self.cidpressright = self.fig.canvas.mpl_connect(
        'button_press_event', self.on_press_right)

    def on_press_right(self, event):
        global count, castLog, dvls, ax1
        print event.button
        if event.button != 3: return
        tag = 'Begin'
        # Increase castLog Key to accomodate new Vline
        count += 1
        print 'count: ', count
        # Set castLog values to x-value of triggering event
        castLog[str(count)] = { tag:event.xdata }
        # Spawn a new DraggableVline instance
        color_map = {'Begin':'g', 'End':'r'}
        dvl = DraggableVline(self.fig, ax1.axvline(x=castLog[str(count)][tag], linewidth=2, color=color_map[tag]), count, tag)
        dvl.connect()
        dvls.append(dvl)

        canvas = self.fig.canvas
        canvas.draw()

class MainFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, wx.ID_ANY)
            global castLog, count, ax1, dvls
            fig = Figure()
            canvas = FigureCanvasWxAgg(self, -1, fig)
            ax1 = fig.add_subplot(111)

            # Create empty dict that will hold new V-line Data
            castLog = { } 
            dvls = [ ]
            count = 0

            # Instantiate New Vline Listener
            NVL = NewVLineListener(fig)
            NVL.connect()

if __name__ == '__main__':
        app = wx.PySimpleApp()
        app.frame = MainFrame()
        app.frame.Show()
        app.MainLoop()
4

1 に答える 1