From: nagai@... Date: 2002-01-25T12:21:04+09:00 Subject: Re: Tk interface with Ruby Hi, From: Bhagavatheeswaran Mahadevan Subject: Tk interface with Ruby Date: Wed, 23 Jan 2002 22:24:06 +0900 Message-ID: > I had one question on the Tk interface with Ruby ................How do u > place the widgets one below the another.......do u have any sample code for > that.........maybe using the pack or grid feature ......... Pack and Grid arrange widgets *WITHOUT* overlapping. If you want to make a widget overlapping other widgets, please use Place geometry manager. # Or use two geometory managers on one Frame widget. :-) And to change stacking order of such widgets, use raise or lower method. The following is a sample script; TkLabelFrame composite widget class. (And a sample of TkComposite module.) In it, I use place geometory manager to arrange the label text on the relief of Frame widget. ------------------------------------------------ class TkLabelFrame < TkFrame include TkComposite # default frame pad Default_FramePad = 10 def initialize_composite(keys = {}) keys = keys.dup # generate frames @relief_frame = TkFrame.new(@frame, 'relief'=>'groove', 'borderwidth'=>2) @widget_frame = TkFrame.new(@relief_frame) @path = @widget_frame.path # generate label @box_label = TkLabel.new(@frame) # pack and place @widget_frame.pack('expand'=>true, 'fill'=>'both') @relief_frame.pack('ipadx'=>0, 'ipady'=>0, 'expand'=>true, 'fill'=>'both') # delegate delegate('DEFAULT', @frame, @relief_frame, @widget_frame) delegate('background', @frame, @relief_frame, @widget_frame, @box_label) delegate('text', @box_label) delegate('font', @box_label) delegate('borderwidth', @relief_frame) delegate('relief', @relief_frame) # textforeground if color = keys.delete('textforeground') textforeground(color) end # framepad framepad(keys.delete('framepad'){Default_FramePad}) # set property configure keys unless keys.empty? end def textforeground(color) @box_label.foreground(color) end def framepad(size) @widget_frame.pack('padx'=>size, 'pady'=>size) @relief_frame.pack('padx'=>size, 'pady'=>size) @box_label.place('x'=>size*2, 'y'=>size, 'anchor'=>'w') end end ------------------------------------------------ And the next is a sample of usage. ------------------------------------------------ fb = TkLabelFrame.new(nil, 'text'=>'BOX', 'background'=>'white', 'textforeground'=>'red', 'framepad'=>5).pack('expand'=>true, 'fill'=>'both') TkButton.new(fb, 'text'=>'XXX').pack('fill'=>'x') TkButton.new(fb, 'text'=>'EXIT', 'command'=>proc{exit}).pack('fill'=>'x') ------------------------------------------------ -- Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)