Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2018 | 02 | 03 | 04 | 05 |

2014-05-11(Sun)

Ruby/Tk サブウィンドウの作成

サブウィンドウ用のメソッドopen_sub_windowを作成して、このメソッド内でサブウィンドウウィジェットを配置して作成します。

ルートウィンドウ側との情報のやり取りについて、最初メソッド引数と返り値で行おうとしましたが、メソッド自体は直ぐに終了してしまうため不可でした。この為グローバル変数$swによって行う様にします。

サブウィンドウベースはTkToplevelを使用します。またサブウィンドウを開いている間にルートウィンドウへの操作を不可にするために、TkToplevel#grab_setを実行します。サブウィンドウ閉じるときは、TkToplevel#destroyを実行。


#coding: Windows-31J
require "tk"

# サブウィンドの設定を保存する変数
$sw = TkVariable.new_hash
# 初期設定
$sw[:status] = :INIT
$sw[:entry]  = ''
#$sw[:radio]  = 'item_r0'
$sw[:radio]  = ''
$sw[:check0] = '1'
$sw[:check1] = '0'
$sw[:check2] = '0'

#
# Sub Window
#
def open_sub_window
p 'method start'

  $sw[:status] = :OPEN
  base = TkToplevel.new(nil, title: 'Sub Window')
  # Root Windowの操作を禁止する
  base.grab_set

  e = TkEntry.new(base).pack(side: :top, fill: :x)
  e.value = $sw[:entry]
  flame = TkFrame.new(base).pack
  f_left  = TkLabelFrame.new(flame) do
    text('RadioButton')
    pack(side: :left)
  end
  f_right = TkLabelFrame.new(flame) do
    text('CheckButton')
    pack(side: :left)
  end
  TkButton.new(base) do
    text('close')
    # Entry入力文字を$swにコピーしてから、ウィンドウを閉じる
    command( proc do
               $sw[:entry]  = e.value
               $sw[:status] = :CLOSE
               base.destroy
             end
    )
    pack(fill: :x)
  end

  3.times.each do |i|
    TkRadioButton.new(f_left) do
      text  "item_r#{i}"
      value "item_r#{i}"
      variable $sw.ref(:radio)
      select if i == 0          # 初期設定
      pack(side: :top)
    end
  end

  TkCheckButton.new(f_right, text:'item_c0', variable: $sw.ref(:check0)).pack
  TkCheckButton.new(f_right, text:'item_c1', variable: $sw.ref(:check1)).pack
  TkCheckButton.new(f_right, text:'item_c2', variable: $sw.ref(:check2)).pack
  
p 'method end'
end

#
# Root Window
#

TkRoot.new.title('サブウィンドウへのアクセス')

txt = TkText.new
txt.pack(side: :top)

btn1 = TkButton.new do
  text('Open Sub Window')
  # サブウィンドウを開く
  command(
    proc do
      open_sub_window
    end
  )
  pack(side: :left, fill: :x)
end

btn2 = TkButton.new do
  text('Result')
  # $swの値を表示する
  command(
    proc do
      txt.value  = "入力した文字は、#{$sw[:entry]}です。\n"
      txt.value += "ラジオボタンは、#{$sw[:radio]}が選択されています。\n"
      txt.value += "item_c0が選択されています。\n" if $sw[:check0] == '1'
      txt.value += "item_c1が選択されています。\n" if $sw[:check1] == '1'
      txt.value += "item_c2が選択されています。\n" if $sw[:check2] == '1'
    end
  )
  pack(side: :left, fill: :x)
end

Tk.mainloop

2014-05-06(Tue)

Ruby/Tk TkVariableの使用

ウィジェットで変化する値を使用する場合にはTkVariabeを使用する。TkVariableの値が変化すると、その変数を参照しているウィジェット上の表示が即時変化する。

TkVariable#new_hashとするとHashとして使用できる。この場合にはウィジェット内で使用する場合には、TkVariable#ref(key)とする。

#coding: Windows-31J

require "tk"

root = TkRoot.new do
  title 'TkVariable Test'
  geometry '300x150+100+100' # 親ウィンドウのサイズと位置
end


d0 = TkLabel.new(root, text:'下段の入力文字が上段に即時反映される')
d0.pack

v1 = TkVariable.new('Label1')
d1 = TkLabel.new(root) do
  textvariable v1
  pack(anchor: :w)  # 表示を左寄せにする(w: west)
end
e1 = TkEntry.new(root) do
  textvariable v1
  pack(fill: :x)
end

TkLabel.new.pack

# TkVariableをHashとして使用
v2 = TkVariable.new_hash(str: 'Label2')

# HashへのアクセスはTkVariable#ref(key)を使用する
d2 = TkLabel.new(root) do
  textvariable v2.ref(:str)
  pack(anchor: :w)
end
e2 = TkEntry.new(root) do
  textvariable v2.ref(:str)
  pack(fill: :x)
end

Tk.mainloop

2014-05-03(Sat)

Ruby/Tk ウィジェットへのパラメータ指定方法

サンプルをみると書き方がいろいろあって混乱するのでメモ

#coding: windows-31J
require 'tk'

# Widjetのパラメータの指定方法


# newの引数として指定する方法
# 第1引数は親ウィジェット
# 第2引数以降はHashのキーと値
#   キーはStringでもSymbolでもOK
#   値も定数はSymbolでOK
TkButton.new(nil, text:'ボタン1', command:proc{puts 'Button 1 Pushed'}).pack(fill: :x)
#TkButton.new(nil, 'text'=>'ボタン1', 'command'=>proc{puts 'Button 1 Pushed'}).pack('fill'=>'x')



# blockとして指定する方法
TkButton.new(nil) do
  text( 'ボタン2' )                       # 丸カッコは省略可
  command( proc{puts 'Button 2 Pushed'} )
  pack(fill: :x)
end




# インスタンスのメソッドとして指定する方法
b3 = TkButton.new(nil)
# 値を代入
b3.text = 'ボタン3'
b3.command = proc{puts 'Button 3 Pushed'}
# 値を引数としても渡せる
#b3.text( 'ボタン3' )                    # 丸カッコは省略可
#b3.command( proc{puts 'Button 3 Pushed'} )
b3.pack(fill: :x)


Tk.mainloop