From: Kikutani Makoto Date: 1997-11-18T12:13:54+09:00 Subject: [ruby-list:5318] when should I call Tk mainloop? (Re: Win32 用の Ruby での tk の使用 ) きくたにです。 Mon, Nov 17, 1997 at 09:04:00AM +0900 において aito@ei5sun.yz.yamagata-u.ac.jp さん曰く: > > なんか質問する個所が違うので、恐縮なんですがひとつ教えてください。 > > tkって、本家Tcl/tk、Ptyhon/tk、Perl/tkなどの実装を知ってますが、簡単に > > 追加ライブラリとして組み込むことができるものなんでしょうか。 > > コードを見たことがないので、結構不思議なんです。 > > tk 単独ではリンクできません.tcl/tk をそのままリンクします. あまりrubyねたじゃないのですが、tcl/tkに詳しい人が多そうなので 便乗質問なのです。 昔から言ってるVerilogシミュレータから呼べる波形ビューワですが、 重弘さんのがrubyに標準実装されるまではと、今はPythonでやってます。 # Pythonは疲れるから、はよrubyに戻りたい (親プロセス) (子プロセス) Verilog PLI(C program) <-> Pythonスクリプト という関係で、信号の追加や変化は親プロセスから、双方向stdio介して、 ストリングで送られてきます。 シミュレーションを途中で停めて途中結果を見たり、信号の追加 したりするので、子プロセスは下のようなループをしてます (Pythonで勘弁^^)。 ------------------------------------------------------------- while 1: type, str = ipc_receive(fd) if type == FINISH: # シミュレーション終了 break elif type == START: # # シミュレーション開始(今は何もしない) pass elif type == STOP: # シミュレーション中断 tr.tune_xaxis() # スクロールエリアとか再設定 root.update() # 画面のアップデート # thread.start_new_thread (root.mainloop, ()) while 1: # シミュレーション続行指令が来るまで待つ type, str = ipc_receive(fd) if type == CONT: break # thread.exit_thread() elif type == ADDSIGNAL: # 信号の追加 w = Wave(str) # 一つの信号用にCanvas作成 waves[str] = w # 連想配列に信号名でCanvasを登録 tr.addWave(str, w, 0, wav_ypos) # Canvasを親Canvasに追加 wav_ypos = wav_ypos + wavheight elif type == SIGVALUES: # 信号の変化 l = string.split(str) nam = l[0] t = l[1] b = l[2] waves[nam].plot_bit(t, b) # 線のプロット root.mainloop() ------------------------------------------------------------- 問題は Tkのmainloop を呼ぶタイミングなのです。 データ全部受け取った後、mainloop を呼べれば簡単なんですが、 上の話のようにそうではないのです。 rubyのtkモジュール使用スクリプトでは必ず最後にTk.mainloopが来ますが、 Pythonでも root.mainloop() なんてのが最後に来ます。 これだと、シミュレーション中断中は、(上でいう)root.update() で tkの窓は出て波形も見えるんですが、スクロールなど、いっさい窓の 操作ができないんですね。 そこで、最後に root.mainloop() を呼ぶのではなく、 中断中だけ、スレッドでroot.mainloop()を動かそうとしたり して、上のコメントになってるようなこともしてみましたが、 やはりうまくいかないようです。 そもそも私のしたいことは ruby+tk や Python+tk ではできないのでしょうか? Cにtcl/tkをリンクしたほうがいいのでしょうか? -- 人生を背負い投げ 菊谷 誠(Kikutani Makoto) kikutani@eis.or.jp kikutani@jdc.ericsson.se hgf03701@niftyserve.or.jp http://www.eis.or.jp/muse/kikutani/