require 'tk' class TkTool include Tk Type=["top","menu","frame","label","entry","text","radio","check","list","yesno","button","ok"] def initialize(w=nil,type="label",title="",data="",default=nil,side="top") @type=type @data=data @var=0 if ["frame","label","entry","text","radio","check","list","yesno"].include?(@type) width=(@type=="frame")?data.to_f : 0 f=TkFrame.new(w,"relief"=>"groove","borderwidth"=>width).pack('side'=>side) @var=f if @type=="frame" end if ["frame","label","entry","text","radio","check","list"].include?(type) TkLabel.new(f){text title}.pack('side'=>'left') end case @type when "top" # data: exclude delete @var=TkToplevel.new @var.title(title) @var.protocol("WM_DELETE_WINDOW",proc{w.withdraw}) unless @data=="" when "menu" # data: menu TkMenubar.new(w,@data,'tearoff'=>false,'foreground'=>'blue', 'activeforeground'=>'red').pack('side'=>'top','fill'=>'x') when "label" @var=TkLabel.new(f){text data}.pack('side'=>'left') when "entry" default=10 if default==nil @var=TkEntry.new(f,'width'=>default).pack('side'=>"right") @var.value=@data when "text" default=[10,20] if default==nil scr=TkScrollbar.new(f).pack('fill'=>'y','side'=>'right') @var=TkText.new(f,'height'=>default[0],'width'=>default[1]).pack('side'=>'right') @var.yscrollbar(scr) @var.value=@data when "radio" default=@data[0][1] if default==nil @var=TkVariable.new(default) for dt in @data TkRadiobutton.new(f, "text"=> dt[0], "value"=> dt[1], "variable"=> @var ).pack('anchor'=>'w') end when "check" @var=[] default=Array.new(@data.size,0) if default==nil for i in 0...@data.size @var[i]=TkVariable.new(default[i]) TkCheckbutton.new(f, "text"=> @data[i], "variable"=> @var[i], "onvalue"=> 1, "offvalue"=> 0 ).pack('anchor'=>'w') end when "list" default=@data[0] unless @data.include?(default) # default=@data[0][1] if default==nil @var=TkListbox.new(f){ exportselection 0 height data.size>5?5:data.size yscrollbar(TkScrollbar.new(f).pack('fill'=>'y','side'=>'right')) selectmode 'single' }.pack for ins in @data @var.insert('end',ins) end @var.selection_set(@data.index(default)) when "yesno" default=@data[0] if default==nil @var=TkVariable.new(default) TkCheckbutton.new(f, "text"=> title, "variable"=> @var, "onvalue"=> @data[0], "offvalue"=> @data[1] ).pack('anchor'=>'w') when "button" TkButton.new(f,'text'=>title,'command'=>@data).pack('anchor'=>'w') when "ok" TkButton.new(w,'text'=>'OK', 'command'=>proc{@data.call;w.destroy}).pack('side'=>'left') TkButton.new(w,'text'=>'cancel', 'command'=>proc{w.destroy}).pack('side'=>'right') end end def value() r=nil case @type when "label" r=@var.text when "entry","text","radio","yesno" r=@var.value when "check" r=@var.map{|l| l.value} when "list" r=@data[@var.curselection[0]] end return r end def set(val) case @type when "label" @var.text=val when "entry","text","radio","yesno" @var.value=val when "check" val.each_with_index{|v,i| @var[i].value=v} when "list" @var.selection_clear(0,'end') @var.selection_set(@data.index(val)) # @var.selection_set(@data.collect{|l| l[1]}.index(val)) end end def value=(val) set(val) end def bind(btn="Button-1") @var.bind(btn,proc{yield}) end def window() @var end end #class # Tk.mainloop #2012.4.8 #2013.9.9 button, ok #2013.9.10 top, menu