From: matz@... (Yukihiro Matsumoto) Date: 1997-09-11T19:30:59+09:00 Subject: [ruby-list:4273] Re: [Q] tk ext... まつもと ゆきひろです In message "[ruby-list:4272] [Q] tk ext..." on 97/09/11, Kikutani Makoto writes: |[1 ] |きくたにです。 | |そろそろ、rubyで実用プログラムを書きたいので、添削をお願いしようと |思います。 おおっ. |1) 標準入力はいずれUnixソケットからの入力に置き換えますが、この調子で | 膨大なデータを受けとっていって、TkのCanvasは問題ないですか? | (あとズーム機能など入れなくちゃだめだし) こいつはTkの問題なので私は良くわからんです.どうなんでしょう? どなたかご存知ありません? |2) WViewerクラス中で使っている、$v, $c, $scrは最初インスタンス変数にして | たのですが、大域変数にしないとだめでした。これはそういうものですか? この場所ではselfがすりかわっていますので,インスタンス変数は Frameのものになってしまいます.ここはイテレータブロックの中 で生成するのではなく, @frm = TkFrame.new { ... } @v = TkCanvas.new(@frm) { .. } というスタイルをお勧めしたいです. # やはりselfをすりかえるという発想に無理があったか. |3) draw_scaleというメソッドでやっていることは、最初、 | $v = TkCanvas.new(f){ ... } の直後でやってたのですが、表示が変でした。 | これはなぜ? こちらでは再現しなかったので,よくわかりません. |4) その他直したほうがいい点 その方が良いかどうかはわからないのですが,ハッシュを使って初 期化する版を作ってみました.また,インスタンス変数を使うよう にもしています. #!/usr/bin/ruby # test program for WaveViewer which can be called from Verilog PLI require "tkclass" # initial window size $width = '500' $height = '100' $vwidth = 30 $pr_time_step = 100 class WViewer def initialize(signame) @high = $height.to_i * 0.2 @low = $height.to_i * 0.7 @pr_time = 0 @last_x = 0 @last_y = @low @frm = TkFrame.new TkLabel.new(@frm, 'text'=>signame).pack('side' =>'top') # canvas for vertical axis @v = TkCanvas.new(@frm, 'relief' => 'sunken', 'bg' => 'LightCyan1', 'height' => $height, 'width' => $vwidth.to_s).pack('side' =>'left', 'fill'=>'y') # canvas for plotting the points @c = TkCanvas.new(@frm, 'relief' => 'sunken', 'bg' => 'LightCyan1', 'height' => $height, 'width' => $width, 'closeenough' => '3').pack('side' =>'top', 'fill'=>'both', 'expand'=>'1') draw_scale @c.xscrollcommand proc{|idx| @scr.set *idx } @scr = TkScrollbar.new(@frm, 'orient' => 'horizontal'). pack('side'=>'bottom', 'fill'=>'x') @scr.command proc{|idx| @c.xview *idx } @frm.pack end def draw_scale # draw vertical scale TkcLine.new(@v, $vwidth/2+10, @low, $vwidth/2+10, @high, 'fill'=>'blue') TkcLine.new(@v, $vwidth/2, @low, $vwidth/2+10, @low, 'fill'=>'blue') TkcLine.new(@v, $vwidth/2, @high, $vwidth/2+10, @high, 'fill'=>'blue') TkcText.new(@v, 5, @high, 'text'=>'1', 'fill'=>'red') TkcText.new(@v, 5, @low, 'text'=>'0', 'fill'=>'red') end def plot_bit(dt, b) x = @last_x + dt if b == 1 y = @high else y = @low end TkcLine.new(@c, @last_x, @last_y, x, @last_y) TkcLine.new(@c, x, @last_y, x, y) if x >= @pr_time TkcText.new(@c, x, @low+10, 'text'=>x, 'fill'=>'green') @pr_time += $pr_time_step end @last_x = x @last_y = y end def set_scrarea @c.configure('scrollregion', "0 0 #@last_x #$height") end end # 1st line is the signal name signal = gets view = WViewer.new(signal) # now plot points from stdin while gets dt, b = split view.plot_bit(dt.to_i, b.to_i) end # set scroll area view.set_scrarea Tk.mainloop