5

私のトップレベルウィンドウは、GUIの他のさまざまな部分を更新できるように、カスタムコントロールの内部状態がいつ変更されるかを知る必要があります。コントロールでカスタムイベントを生成して、トップレベルウィンドウで伝播および処理できるようにするにはどうすればよいですか?

4

2 に答える 2

12

これは古い質問であることは知っていますが、wxPython でこれを行うための、より新しく、少し優れた方法があります。http://wiki.wxpython.org/CustomEventClassesおよび上記からの言い換え:

イベントを定義するには:

import wx.lib.newevent
QuantityChangedEvent, EVT_QUANTITY_CHANGED = wx.lib.newevent.NewCommandEvent()

イベントを生成するには:

event = QuantityChangedEvent(self.GetId())
self.GetEventHandler().ProcessEvent(event)
# or ...
#wx.PostEvent(self, event)

イベントのバインドは同じままです。

于 2010-09-07T13:40:15.040 に答える
11

伝播するには、イベントはwx.CommandEventである必要があります。(伝播の詳細については、wxWidgetsイベント処理の概要を参照してください。)より具体的には、wx.PyCommandEventである必要があります。これは、Pythonに対応しており、wxWidgetsイベントシステムを介してPythonビットを安全に転送できます。イベントハンドラーが呼び出されます。

カスタムイベントタイプを次のように定義します。

EVT_QUANTITY_CHANGED = wx.PyEventBinder(wx.NewEventType(), 1)

モジュールレベルでこれを実行することをお勧めしますが、状況によって__init__は、制御方法でこれを実行することが望ましい場合があります。

これで、コントロールは次のようにイベントを生成できます。

event = wx.PyCommandEvent(EVT_QUANTITY_CHANGED.typeId, self.GetId())
self.GetEventHandler().ProcessEvent(event)

トップレベルウィンドウは、通常の方法でイベントをバインドおよび処理できます。

self.Bind(mycontrol.EVT_QUANTITY_CHANGED, self.OnQuantityChanged)
于 2009-03-12T19:05:50.700 に答える