|

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

(solved) Ruby/Tk: TkPackage can't find package BWidget (RuntimeError) / Ubuntu Studio 8.04

Ruby/TK - Combobox Widget のサンプルを実行したときに require 'tkextlib/bwidget' の箇所で出たエラー。

/usr/lib/ruby/1.8/tk/package.rb:86:in `require': TkPackage can't find package BWidget (RuntimeError)
    from /usr/lib/ruby/1.8/tkextlib/bwidget.rb:16
    from ./test.rb:2:in `require'
    from ./test.rb:2

sudo apt-get install bwidget で解決。

環境は
- Ubuntu Studio 8.04
- Ruby 1.8.6
- Tk::TK_VERSION #=> 8.4
スポンサーサイト

Ruby/Tk: TkFrame を使って listbox+scrollbar を配置する

pack だけでは簡単なレイアウトしかできない、 でもグリッドレイアウトはめんどくさい、 という場合に便利なのが TkFrame。 listbox + scrollbar の使い方と併せてメモしておく。

フレームの中に子ウィジェットを配置することで 複数のウィジェットをグループ化し、 それを貼り付ける、というイメージ。

といっても子(フレームに入れるウィジェット)のインスタンス 生成時に引数で親(フレーム)を指定すればいいだけなので 特に難しいことはなかった。

require "tk"


label_green  = TkLabel.new{ text "red"   ; bg "#ff0000" }
label_red    = TkLabel.new{ text "green" ; bg "#00ff00" }

frame = TkFrame.new
# new の引数で親(フレーム)を指定
label_blue = TkLabel.new( frame ){ text "blue"; bg "#0088ff" }
sbar = TkScrollbar.new( frame )
lbox = TkListbox.new( frame ){
  height 10
  yscrollbar sbar # listbox のプロパティ yscrollbar に登録
}
(0..99).each{ |n|
  lbox.insert( "end", "item #{n}" )
}


label_green.pack( :side => :top )

frame.pack( :side => :top )
lbox.pack( :side => :left )
sbar.pack( :side => :left, :fill => :y )
label_blue.pack( :side => :left )

label_red.pack( :side => :top )


Tk.mainloop

参考(外部リンク)

Ruby: eval からブロック付きメソッドへ、書き方を順に変えてみる

例として配列もどき、メディアプレーヤなんかで使いそうな PlayList クラスを使う。

class PlayList
  def initialize( arr )
    @track_list = arr
  end
end

PlayList.track_list のそれぞれの要素に対応して (それぞれの要素を使って)何らかの「処理」をしたくなったとする。
さらに、汎用的にする(使いまわせるようにする)ために、 「処理」の内容は呼び出す側で指定できるようにする、という場合を考えてみる。

ブロック付きメソッド(イテレータ)よく分からん、でも eval なら知ってるしよく使う、 という人はこんな感じにするんじゃないでしょうか。
(いや、ツッコミ入るでしょうが説明のためということで…)

class PlayList
  def initialize( arr )
    @track_list = arr
  end

  def each( str )
    @track_list.each do |track|
      eval str
    end
  end
end

pl = PlayList.new( ["track1", "track2", "track3"] )

pl.each( %Q! puts "\#{track}" ! )

結果:

track1
track2
track3

「処理」の内容を呼び出す側で指定することができた。

処理を変更する場合も

pl.each( %Q! print "\#{track}\n" ! )

などと呼び出す側で変更できる。

ただし、処理が複雑になるとややこしくなるし、 eval を使うこの方法はできれば使いたくない。 この時点でもうすでに #{} を使って さらに # をエスケープしたりしていて、 かなりいやな雰囲気が漂っている。

Ruby ハチドリ本 にも 「 経験の浅いプログラマは、杖をつくようにevalを使ってしまうことがある。 自分のコードでevalを使いたくなったときには、 使わずに済ませる方法がないか、よく考えた方がよい。」 (p279) とある。



** ホームに戻る

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。