wxptyhonのカスタムイベントにハマる
最近、wxPythonをいじっているのですが、独自のイベント拡張でハマったのでメモ。 wxのデモに入っているPythonEvent.pyを参考に、イベントの作り方を以下と判断。 やりたいのはCUIからGUIへの強制イベントの発行ですが wx.NewEventType()でイベントタイプをつくる wx.PyEventBinder(...)で1のイベントのバインダーを作る wx.PyCommandEventのサブクラスに、イベントに渡したい変数を設定 3のクラスのインスタンスを作り変数をセット イベントハンドラーの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() ここまでで、半日。道のりは険しい……