From: Joe Van Dyk Date: 2005-08-30T03:48:13+09:00 Subject: Re: Tk menu On 8/29/05, Bart Masschelein wrote: > Hello there, > > I started experimenting with Tk, out of the box, with the basic > examples, and I loved the way to implement menus: > > menu_spec_1 = > [ [ ['main 1', 0], > ['1 sub', 0] > ], > [ ['main 2', 0], > ['2 sub', 0] > ] > ] > > and then calling > > TkMenubar.new(root, menu_spec_2, 'tearoff'=>false).pack('fill'=>'x', > 'side'=>'top') > > However, I wanted to have a submenu under a menu item, so I tried > > menu_spec_2 = > [ [ ['main 1', 0], > ['1 sub', 0] > ], > [ ['main 2', 0], > [ ['2 sub', 0], > ['2 sub sub', 0] > ] > ] > ] > > This doesn't work, Ruby gives me an error. So apparently this is not > supported. Has sbdy already extended the menuspec.rb file to support > this behaviour, or would this straightforward to do, or even feasible > (I'm just starting with Ruby)? > > I want to avoid the 'hassle' of creating each menu item itself, and then > structuring them. Been there, done that, in other languages. Yeah, the menu spec thing is sorta confusing for submenus. From the TkMenuSpec docs (found at http://www.ruby-doc.org): The format of the menu_spec is: [ menu_info, menu_info, ... ] And the format of the menu_info is: [ [text, underline, configs], # menu button/entry (*1) [label, command, underline, accelerator, configs], # command entry [label, TkVar_obj, underline, accelerator, configs], # checkbutton entry [label, [TkVar_obj, value], underline, accelerator, configs], # radiobutton entry [label, [[...menu_info...], [...menu_info...], ...], underline, accelerator, configs], # cascade entry '---', # separator ... ] underline, accelerator, and configs are optional pearameters. Hashes are OK instead of Arrays. Then the entry type ('command', 'checkbutton', 'radiobutton' or 'cascade') is given by 'type' key (e.g. :type=>'cascade'). When type is 'cascade', an array of menu_info is acceptable for 'menu' key (then, create sub-menu).