1

ubuntuマシンでmatplotlibバックエンドと一緒にwxpythonを使用しています。私のmatplotlibキャンバスをwxpythonモーダルダイアログをポップアップするbutton_press_eventに接続したいと思います。モーダル ダイアログが表示されると、アプリケーション全体がフリーズします。この問題は、Windows マシンでは発生しません。通常、問題を再現するスニペットを次に示します。

import wx

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


class SettingDialog(wx.Dialog):

    def __init__(self, parent=None):

        wx.Dialog.__init__(self, parent, wx.ID_ANY, title="Modal dialog")


class PlotterFrame(wx.Frame):

    def __init__(self, parent, title="Frame with matplotlib canvas"):

        wx.Frame.__init__(self, parent, wx.ID_ANY, title)

        self.figure = Figure(figsize=(5,4), dpi=None)
        self.canvas = FigureCanvasWxAgg(self, -1, self.figure )
        self.canvas.mpl_connect("button_press_event", self.on_click)


    def on_click(self, event=None):
        d = SettingDialog(self)
        d.ShowModal()
        d.Destroy()  

if __name__ == "__main__":
    app = wx.App(False)
    f = PlotterFrame(None)
    f.Show()
    app.MainLoop()

私のコードの何が問題なのか分かりますか?

PS0 : 問題は、デスクトップ内のすべてのアプリケーションが反応しなくなるのと同様に、ダイアログ ウィンドウもフリーズすることです。脱出する唯一の方法は、キーボードを使用して別のデスクトップに切り替えることです

PS1 : http://eli.thegreenplace.net/files/prog_code/wx_mpl_bars.py.txt のような非常に一般的な例では、問題も発生します。結論として、この問題は Linux (ここでは ubuntu 12.04) のバグです。次のライブラリ バージョン: wx. バージョン: '2.8.12.1' matplotlib. バージョン: '1.1.1rc'

4

2 に答える 2

1

モーダル ダイアログの要点は、ダイアログがモーダル状態にある間、アプリケーションをフリーズさせることです。アプリケーションをフリーズさせたくない場合は、ダイアログをモーダルに表示しないでください。

于 2013-05-29T15:56:18.927 に答える
1

いくつかの異なる Linux システムでも、この問題に遭遇しました。言及されているさまざまなリソースのいずれも、この問題とまったく同じことを説明しているようには見えません。調査の結果、 Matplotlib FigureCanvas でマウス リリース イベントが発生するにモーダル ダイアログを表示しようとすると、何かがロックしているようです。

それを理解したら、解決策は非常に簡単です。イベント ハンドラーは次のようになります。

def on_click(self, event=None):
    try:
        event.guiEvent.GetEventObject().ReleaseMouse()
    except:
        pass
    d = SettingDialog(self)
    d.ShowModal()
    d.Destroy()

コードを複雑にする可能性のある問題の 1 つは、すべての matplotlib イベントが同じ構造を持っているわけではないことです。したがって、これが 'pick_event' ハンドラーだった場合は、代わりに次のようにします。

event.mouseevent.guiEvent.GetEventObject().ReleaseMouse()

どの matplotlib イベントによってイベント タイプが渡されるかについては、http://matplotlib.org/users/event_handling.htmlを確認してください。

于 2013-10-01T04:21:49.703 に答える