前のページ 次のページ 目次

10. How do I get widget X to do Y ?

もし、ボタンが欲しかったら、

TkButton.new
とすれば良い。 もし、このボタンに後で操作を加えたいならば、
button = TkButton.new
というように、 〜を変数に入れておく。 これだけでは、画面に表示されないので、
button.pack
と、pack する。とりあえず、ボタンを表示する スクリプトの全部を書くと、

#!/usr/local/bin/ruby

require "tk"

button = TkButton.new
button.pack

Tk.mainloop

のようになる。このボタンには、ラベルがついていないが、 configure メソッドでつけることができる。

#!/usr/local/bin/ruby

require "tk"

button = TkButton.new
button.configure('text' => 'Press me!')
button.pack

Tk.mainloop

このスクリプトを別の書き方をすると、次のようになる。

#!/usr/local/bin/ruby

require "tk"

button = TkButton.new {
  text 'Press me!'
}.pack

Tk.mainloop

このコードでは、ボタンを押しても何も起こらない。 ボタンを押したときの動作をメソッドにバインドする仕方は、後ほど…

10.1 ボタンを押したとき実行されるコマンドをruby のメソッドに結びつけるには?

command option?でボタンを作成したときか、packしたときに こうやって指定すれば良い。

10.2 ボタンの上にマウスが来たときにイメージを変更するには?

imageとactiveimageを指定する

10.3 widgets の配置はどうやったら良いの?

Tcl/Tk と同様に、packer, placer, grid を使用する。

widget.pack



#!/usr/local/bin/ruby

require "tk"

top2 = TkToplevel.new
frame = TkFrame.new(top2)
frame.pack
TkLabel.new(frame) {
  text 'Left2'
  pack('side' => 'left')
}
TkLabel.new(frame) {
  text 'Right2'
  pack('side' => 'right')
}
TkLabel.new(top2) {
  text 'Bottom2'
  pack('side' => 'bottom')
}

Tk.mainloop

10.4 ダイアログとか、メニューとか、その他ポップアップするようなのはどうやったら?

シンプルなダイアログボックスは、TkDialog クラスを使えば良いでしょう。

もし、TkDialog クラスなどを使わないのであれば、

top = TkToplevel.new
などのように、TkToplevel クラスを使用します。

10.5 キーアクションと動作を結びつけるには?

widget.bind('<keyname>', action)
or widget.bind '<keyname>', action

10.6 キーバインディングを加えるには?

10.7 スケールの動きをバインドするには?



#!/usr/local/bin/ruby

require "tk"

items = ["One", "Two", "Three", "Four",
  "Five", "Six", "Seven", "Eight",
  "Nine", "Ten", "Eleven", "Twelve"]

scroll = TkScrollbar.new

box = TkListbox.new {
  relief 'sunken'
#  width -1
  height 5
  setgrid 'yes'
  yscrollcommand proc{|idx| scroll.set *idx}
}.pack('side'=>'left','fill'=>'both','expand'=>'yes')

scroll.command(proc{|*args| box.yview *args})
scroll.pack('side'=>'right', 'fill'=>'y')

for i in items
  box.insert 'end', i
end

Tk.mainloop

10.8 一つのスクロールバーを複数の widgets に結びつけるには?

10.9 ビットマップを表示するには?

TkLabel.new {
  bitmap 'bitmap-name'
}.pack('side' => 'top')

TkLabel.new {
  bitmap ('@' + ['.','images','face.bmp'].join(File::Separator))
}.pack('side' => 'top')

10.10 イメージを表示するには?



#!/usr/local/bin/ruby

require "tk"

TkLabel.new {
  text 'Main'
}.pack
$imggif = TkPhotoImage.new {
  file '/usr/local/lib/tk4.2jp/demos/images/earth.gif'
}
TkLabel.new {
  image $imggif
}.pack
TkButton.new {
  text 'close'
  command 'Tk.root.destroy'
}.pack('side' => 'left')
TkButton.new {
  text 'exit'
  command 'exit'
}.pack('side' => 'right')

Tk.mainloop

10.11 どんなイメージが表示できますか?

Tcl/Tk に準ずる

10.12 リストボックス

10.13 テキスト widget

10.14 ラジオボタンのグループ化

variable を指定。variable は、TkVariable クラスを使用。



#!/usr/local/bin/ruby

require "tk"

letters = TkVariable.new

TkRadioButton.new {
  bitmap '@/usr/local/lib/tk4.2jp/demos/images/letters.bmp'
  variable letters
  value 'full'
}.pack

TkRadioButton.new {
  bitmap '@/usr/local/lib/tk4.2jp/demos/images/noletter.bmp'
  variable letters
  value 'empty'
}.pack

Tk.mainloop

10.15 フォントの指定



#!/usr/local/bin/ruby

require "tk"

TkLabel.new {
  text 'Foo'
  font 'fixed'
}.pack

Tk.mainloop

10.16 エントリー widgetの内容を取り出すには?



#!/usr/local/bin/ruby

require "tk"

def do_print(entered)
  print "The string \"#{entered}\" was entered.\n"
end

$user_entry = TkVariable.new

entry = TkEntry.new {
  textvariable $user_entry
}.pack

TkButton.new {
  text '表示'
  command proc { do_print $user_entry.value}
}.pack

Tk.mainloop

10.17 エントリーでパスワード入力を隠すには?

show というのを使用します。

$user_entry = TkVariable.new

entry = TkEntry.new {
  textvariable $user_entry
  show '*'
}.pack

10.18 エントリーで入力幅を制限するには?

10.19 メニュー


前のページ 次のページ 目次