# Ruby and Tk:- Menu's calling other widgets

**URL:** <https://www.ruby-forum.com/t/ruby-and-tk-menus-calling-other-widgets/96765>\
**Category:** Ruby\
**Created:** [January 24, 2006, 7:15pm UTC](https://www.ruby-forum.com/t/ruby-and-tk-menus-calling-other-widgets/96765 "2006-01-24T19:15:22Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![jmaenpaa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de053/32.png) [@jmaenpaa](https://www.ruby-forum.com/u/jmaenpaa)\
**Post date:** [January 24, 2006, 7:15pm UTC](https://www.ruby-forum.com/t/ruby-and-tk-menus-calling-other-widgets/96765/1 "2006-01-24T19:15:22Z")

</div>

What’s the best (and simplest) method of having a menu item produce  
another widget (a menu for example)? So far I have code as shown below  
which calls a simple button. I’d like to use the proc{foo} method so  
that I can call another file. The idea is to have each type of widget  
organised into many smaller files.

It the proc{require ‘another\_widget’} way possible or recommended?

here’s a menu entry that calls another widget…

```
[['Blah', 0],
    ['command', proc {
      toplevelwindow = TkToplevel.new(root) {
        title "New window"
        #geometry("50x50+100+100")
        #configure('bg'=>"black")
      }

     toplevelbutton = TkButton.new(toplevelwindow) {
       text "Close"
       command proc { toplevelwindow.destroy }
     }.place('x'=>10, 'y'=>10)
   }],
   ],
[['Blah', 0],
    ['command', proc {
      toplevelwindow = TkToplevel.new(root) {
        title "New window"
        #geometry("50x50+100+100")
        #configure('bg'=>"black")
      }

     toplevelbutton = TkButton.new(toplevelwindow) {
       text "Close"
       command proc { toplevelwindow.destroy }
     }.place('x'=>10, 'y'=>10)
   }],
   ],
```

---

<div class="post-metadata">

**Author:** ![jmaenpaa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de053/32.png) [@jmaenpaa](https://www.ruby-forum.com/u/jmaenpaa)\
**Post date:** [January 24, 2006, 11:30pm UTC](https://www.ruby-forum.com/t/ruby-and-tk-menus-calling-other-widgets/96765/2 "2006-01-24T23:30:05Z")

</div>

An example is in the ruby source distribution:  
ruby-1.8.4/ext/tk/sample/demos-en/widget

best regards,  
Gerald

If you only want buttons you might try:

require ‘tk’  
#= windowmaker - create button array, each pops a window  
#global $button[] holds buttons defined by this method  
#parm root the frame which is to hold the button  
#parm b\_text the button text; also becomes toplevel title  
#parm t\_place String, “0x0+100+200”, toplevel window size, place  
#parm init\_color String, “#000000”, 2 hex digits for red, green, blue

# 

def windowmaker(root,b\_text,t\_place,init\_color="#000000")  
toplevelwindow = -1  
b = TkButton.new(root,  
‘text’=\>b\_text,  
‘command’=\> proc {  
toplevelwindow = TkToplevel.new(root, {  
‘title’=\> “#{b.text}”,  
‘geometry’=\>t\_place,  
‘bg’=\>init\_color  
})  
}  
).pack(‘expand’=\>‘yes’,‘fill’=\>‘x’)  
$buttons.push [b,toplevelwindow]  
end

r = TkRoot.new  
f = TkFrame.new®  
$buttons = [] # each entry holds [button,toplevel]  
windowmaker(f,“red”,“100x100”,"#ff0000")  
windowmaker(f,“white”,“200x200”,"#ffffff")  
windowmaker(f,“blue”,“300x300”,"#0000ff")  
windowmaker(f,“0x400+100+100”,“dummy”) # re-configured:

# show reconfiguration of the last button

$buttons[-1][0].configure(‘command’=\>proc{r.destroy;  
exit},‘text’=\>“Quit”)  
f.pack  
Tk.mainloop

---

<div class="post-metadata">

**Author:** ![jmaenpaa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de053/32.png) [@jmaenpaa](https://www.ruby-forum.com/u/jmaenpaa)\
**Post date:** [January 25, 2006, 3:40am UTC](https://www.ruby-forum.com/t/ruby-and-tk-menus-calling-other-widgets/96765/3 "2006-01-25T03:40:42Z")

</div>

Thank you Chaps,

I’ve managed to get it going with proc{load ‘fo.rb’}. I know that it  
may be “bad practice” but I’d like to cut my teeth into a certain  
project.

On Wed, 25 Jan 2006 11:16:34 +0900 Hidetoshi NAGAI

---

<div class="post-metadata">

**Author:** ![jmaenpaa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de053/32.png) [@jmaenpaa](https://www.ruby-forum.com/u/jmaenpaa)\
**Post date:** [January 25, 2006, 3:19am UTC](https://www.ruby-forum.com/t/ruby-and-tk-menus-calling-other-widgets/96765/4 "2006-01-25T03:19:38Z")

</div>

From: John M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: ruby and Tk:- Menu’s calling other widgets  
Date: Wed, 25 Jan 2006 03:13:34 +0900  
Message-ID: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> that I can call another file. The idea is to have each type of widget  
> organised into many smaller files.
> 
> It the proc{require ‘another\_widget’} way possible or recommended?

It must be possible, but I don’t recommend it.  
If your each type of widget is a class,  
‘autoload’ may be a good solution.  
Please see some libraries in ‘/tkextlib/’ directory  
(e.g. ‘tkextlib/iwidgets.rb’ and files in ‘textlib/iwidgets/’).
