Oct 15, 2008

wxptyhonのカスタムイベントにハマる

最近、wxPythonをいじっているのですが、独自のイベント拡張でハマったのでメモ。
wxのデモに入っているPythonEvent.pyを参考に、イベントの作り方を以下と判断。
やりたいのはCUIからGUIへの強制イベントの発行ですが
  1. wx.NewEventType()でイベントタイプをつくる
  2. wx.PyEventBinder(...)で1のイベントのバインダーを作る
  3. wx.PyCommandEventのサブクラスに、イベントに渡したい変数を設定
  4. 3のクラスのインスタンスを作り変数をセット
  5. イベントハンドラーのProcessEvent(…)に4のイベントを渡す
と、ここではたと手が止まる。デモでは5のProcessEventはボタンの.GetEventHandler()とかいう関数でイベントハンドラーが決まるのですが、今作っているのは別スレッドからのイベントのポスト。イベントハンドラーはだれやねん?

試行錯誤の末(というほどでもないが)これはwx.Frameのインスタンスとわかり、やっと動くように。
しかしよく見ると、サブスレッドで命令を実行しても、マウスがGUIを横切るまで変更が実行されてない。
イベントが全くないのでイベントが実行されないのか、再描画されないのが原因かとあたりをつけたのですが、イベントはProcessEventでポストされると即座に実行とマニュアルにはあります。で、wx.FrameにSendSizeEvent()したところ、やっと変更が即座に評価されるようになりました。

結果はこんな関数

def que_event(event_args):
evt = MyEvent()
evt.set_event_values(event_args)
frame.ProcessEvent(evt)
frame.SetSizeEvent()


ここまでで、半日。道のりは険しい……

No comments: