From: Hidetoshi NAGAI Date: 2007-05-23T10:53:07+09:00 Subject: [ruby-list:43559] Re: Ruby/Tk:ドラッグによる範囲選択 永井@知能.九工大です. From: 山崎雄介 Subject: [ruby-list:43558] Re: Ruby/Tk:ドラッグによる範囲選択 Date: Wed, 23 May 2007 10:12:46 +0900 Message-ID: <20070523091401.3E98.Y-YAMASAKI@saeilo.co.jp> > TkGridが使えなかったのはIwidgets::Scrolledframe内にTkGridで配置すると、 > セル数が少なくてウィンドウいっぱいにセルが配置されない場合に、グリッドの > 領域が真ん中によってしまい、左上寄せにする方法がないようだったからです。 > > あ、でもベースとなるフレームをplace(:x=>0, :y=>0)しなおせばいいのでは? > ジオメトリマネージャは奥が深いですね。 frame widget を新しくつくって,その上で grid を使い, そのフレームを f.pack(:expand=>false, :fill=>:none, :anchor=>:nw) で親フレームに配置するというのではいかがですか? 具体的にはこんな感じです. ----------------------------------------------------------------- require 'tk' require 'tkextlib/iwidgets' scr_f = Tk::Iwidgets::Scrolledframe.new scr_f.pack(:expand=>true, :fill=>:both) cols = 4 rows = 6 f = TkFrame.new(scr_f.child_site) f.pack(:expand=>false, :fill=>:none, :anchor=>:nw) btag = TkBindTag.new mark_loc = [0,0] btag.bind('1', '%W %x %y'){|w, x, y| # drag 範囲の起点 mark_loc = f.grid_location(w.winfo_x + x, w.winfo_y + y) } btag.bind('B1-Motion', '%W %x %y'){|w, x, y| # drag 範囲の終点 p [mark_loc, f.grid_location(w.winfo_x + x, w.winfo_y + y)] } ary = (0..(rows-1)).collect{|row| (0..(cols-1)).collect{|col| TkEntry.new(f){|w| w.bindtags_unshift(btag)} } } ary.each{|row| Tk.grid(*row)} Tk.mainloop ----------------------------------------------------------------- -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp