1

私は、埋め込みのmatplotlibフィギュアを備えたGUIにwxPythonを使用するPythonアプリに取り組んでいます。と呼ばれるmatplotlib GUIニュートラルウィジェットを使用しようとするまで、それは本当にうまくいっていましたSpanSelector. 以前は、この動作を自分でコーディングしようとしていましたが、うまくいきませんでした。そのため、それを処理してくれる組み込みのウ​​ィジェットがあることを嬉しく思いました。これらのウィジェットは任意の GUI バックエンドで動作するはずであり、wxPython は間違いなくサポートされているバックエンドです。

現時点では、私のコードは非常に単純です。これらの(関連する)機能を備えた定義済みのアプリケーションクラスがあります。

def init_gui(self):
    ...
    self.button5 = wx.Button(tab, label="Manual select", size=(120, 30))
    self.button5.Bind(wx.EVT_BUTTON, self.get_selection_manual)
    ...

def get_selection_manual(self, event):
    span = matplotlib.widgets.SpanSelector(self.ax, \
        self.process_selection_manual, "horizontal", useblit=True, \
        rectprops=dict(alpha=0.5, facecolor="red"))

def process_selection_manual(self, vmin, vmax):
    print vmin, vmax

機能していた場合は、ボタンをクリックした後にユーザーが行った選択を出力するだけです。それが呼び出されることは知っていget_selection_manualますが、プロットをクリックしてドラッグしても選択が作成されず、コールバックprocess_selection_manualが呼び出されることもありません。

を入れてsleep()から表示を更新してみました。興味深いことに、アプリケーションが のsleep(5)代わりにtime.sleep(5). そのため、Python は停止しましたが、当時想定されていたように選択範囲を描画しました。私はそれが起こるのを見たことがなく、それが何を意味するのかよくわかりません。wxPython ウィジェットと matplotlib ウィジェットを一緒に使用した例は見つかりませんでした。

4

1 に答える 1

3

これは非常に単純な解決策であることが判明しました:span宣言する必要がありself.spanます...何かを行う前にガベージコレクションされていたのでしょうか? いずれにせよ、交換すれば動作するようになりました

def get_selection_manual(self, event):
    span = matplotlib.widgets.SpanSelector(self.ax, \
        self.process_selection_manual, "horizontal", useblit=True, \
        rectprops=dict(alpha=0.5, facecolor="red"))

def get_selection_manual(self, event):
    self.span = matplotlib.widgets.SpanSelector(self.ax, \
        self.process_selection_manual, "horizontal", \
        rectprops=dict(alpha=0.5, facecolor="red"))

useblit色が台無しになったので、フラグも削除しました。この修正に関連しているとは思いませんが、それでも注意してください。

于 2012-12-25T07:13:41.817 に答える