From: Joe Van Dyk Date: 2005-05-06T02:43:00+09:00 Subject: Re: Tkmenubar and checkbuttons On 5/5/05, Joe Van Dyk wrote: > On 5/5/05, Hidetoshi NAGAI wrote: > > From: Joe Van Dyk > > Subject: Tkmenubar and checkbuttons > > Date: Thu, 5 May 2005 17:10:29 +0900 > > Message-ID: > > > I have this snippet as part of my Tk menu bar spec: > > > > > > ['Options', > > > ['Display Map', proc {show_map()}], > > > ['Hide Map', proc {hide_map()}] > > > > > > How can I combine those two menu options into a single checkbutton > > > menu option? The API documentation on it wasn't clear at all. > > > > Maybe, do you want such like as the following? > > ---------------------------------------------------------- > > require 'tk' > > > > m = nil # variable to pass the menu object to procedures > > > > spec = [ > > ['Option', > > > > # define a command entry by Hash > > { > > :type=>'command', > > :label=>'Display Map', > > :command=>proc{ > > show_map() > > m.entryconfigure('Display Map', :state=>:disabled) > > m.entryconfigure('Hide Map', :state=>:normal) > > }, > > :state=>:normal > > }, > > > > # define a command entry by Array > > ['Hide Map', > > proc{ > > hide_map() > > m.entryconfigure('Display Map', :state=>:normal) > > m.entryconfigure('Hide Map', :state=>:disabled) > > }, > > nil, nil, > > {:state=>:disabled} > > ] > > ] > > ] > > > > # add menubar and get the cascade menu object > > m = Tk.root.add_menubar(spec).entrycget('Option', :menu) > > > > Tk.mainloop > > ---------------------------------------------------------- > > -- > > Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) > > > > > > Thanks for the example. That's close to what I originally wanted and > will probably work well enough. > > Just to clarify, what I originally wanted was to be able to have a > single menu entry in the menu. The menu entry should be a check > button with the text "Display Map" next to it. When the menu checkbox > is activated, it should call #show_map. When the checkbox is > inactivated, it should call #hide_map. > I got it to work the way I originally wanted, see below: require 'tk' m = nil # variable to pass the menu object to procedures map_st = TkVariable.new spec = [ ['Option', ['Display Map', map_st, nil, nil, {:command => proc {if map_st.value=="1" show_map else hide_map end}}], ] ] def show_map puts "showing map" end def hide_map puts "hiding_map" end # add menubar and get the cascade menu object m = Tk.root.add_menubar(spec).entrycget('Option', :menu) Tk.mainloop Thanks to the both of you! Joe