dullhikoのだるいブログ

殆ど日記のだるいブログ

PyGTKでイベントを強制的に回すには

2005年08月12日 | プログラミング
重い処理の時。 VBならDoEvents(って、まだあるんだろうか?俺が触ったのは2.0だ…古っ)、
C言語などWin32API直叩きならPeekMessageなどの合わせ技。 たとえば。
変数の定義とはぶっ飛ばしてかいつまんで言えば

while(PeekMessage(&Msg,dWindow,0,0,PM_REMOVE))
{// メッセージ受信処理

  TranslateMessage(&Msg);
  DispatchMessage(&Msg);
 
  if(Msg.message==WM_QUIT)
  break; //ていうかアプリケーション抜ける処理もせねば
 
}

こういう類のでイベントキューを強制的に空にする。
あるいはスレッドを使うか。

この処理は、Python + PyGTKなら、こうだ。

while gtk.events_pending():
  gtk.main_iteration(1)
 
 
これでウィジェットは再描画もされる。
プログレスバーやラベルならquene_draw()とか別にいらない。

ググり方が悪くてruby用gtkのサイトから知ったのは内緒だ
というか、プログレスバーが全然更新されないので、重い処理中の 強制的イベントハンドラ開放を調べまくった俺。
ようやく回答にたどり着けた。

しかし俺の場合、実はプログレスバーが全然進捗していかない本当の原因は、
float()変換している値に対して整数値を ぶつけていたので、
結果としてprogressbar.set_fractionに入れる値が 整数、つまり0と1の二種類だけになっていた罠。

ちなみにスレッドも使ってみたんだが、結局join()でブロックするせいか効果がなかった。なかなか、Win32APIのようには行かないものだ。
やりかたが悪いんだろうか。

今回は、めんどくさくなって一瞬C言語(つかBCB)に手が伸びかけたが、Python & GTKの修練の為と思ってなんとか踏みとどまった。

ま、そういうわけで、俺と同じ目に遭っている人、あるいはこのことを忘れた自分、が必死で検索している時に備えて、GTK、再描画、イベント、Invalidateに相当、DoEvents、キュー、とかキーワードにしそうなのをここに列挙しておくtest。