Joe Van Dyk
5/5/2005 5:43:00 PM
On 5/5/05, Joe Van Dyk <joevandyk@gmail.com> wrote:
> On 5/5/05, Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp> wrote:
> > From: Joe Van Dyk <joevandyk@gmail.com>
> > Subject: Tkmenubar and checkbuttons
> > Date: Thu, 5 May 2005 17:10:29 +0900
> > Message-ID: <c715e64050505011044a55b21@mail.gmail.com>
> > > 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