help: menu item callback in TK

Lin Li linli at computer.org
Tue Feb 29 10:57:40 EST 2000


Hello Randall,

Thank you very very much indeed. I did as steve said in Lambda and it worked
fine. However, it did have this I-am-at-the-far-end-of-Python feel to it. Now that
you have shown the True way, I am again feeling very safe with python.

Thanks again.

Lin

Randall Hopper wrote:

> Lin Li:
>  |Steve Holden wrote:
>  |> lin li wrote:
>  |> > I generated a menu using the data in a dynamically composed list.
>  |> > Since I do not know what will be in the list, I can only have all the
>  |> > command items in the menu to point to the same callback. Now
>  |> > from inside the callback, how can I find out which menu item is
>  |> > selected? ... I am running Python 1.5.2 with Tkinter on NT.
>  |
>  |Provided, of course, that I know how to use lambda. I decided to call this
>  |an incentive and start learning.
>
> ------------------------------------------------------------------------------
> A lambda is one way:
>
>    callback = lambda option="Bananas": sys.stdout.write( option )
>
> ------------------------------------------------------------------------------
> A function is a slightly better one.  You can use statements within it:
>
>    def cb( option="Bananas" ):
>       print option
>    callback = cb
>
> ------------------------------------------------------------------------------
> A callable object is yet another:
>
>    class Call:
>      def __init__( self, option ):
>        self.option = option
>      def __call__( self ):
>        print self.option
>    callback = Call( "Bananas" )
>
> ------------------------------------------------------------------------------
> My personal favorite for Tkinter callbacks is a generalization on this last
> one (thanks to Thomas Heller).  It allows you to write your callback
> functions like normal, and then just use a generic callable object instance
> as the "glue" to keep track of the callback registration arguments and pass
> them to your callback.
>
>    class Call:
>      """Instances of this class store a function as well as a list of
>         arguments.  When they are called, the function will be called together
>         with the arguments used for creating the instance.
>         Slightly different than lambda, but nicer syntax."""
>      def __init__ (self, func, *args):
>        self.func = func           # save the function (or bound method, or ...)
>        self.args = args           # save the arguments to use
>      def __call__ (self):
>        apply (self.func, self.args) # call function, using args as arguments.
>
> Put Call somewhere, then use it over and over, like this:
>
> >>> def MyCallback( option ):
> ...   print option
> ...
> >>> callback = Call( MyCallback, "Bananas" )
> >>> callback()
> Bananas
>
> In Tkinter:
>
> >>> menu.add_checkbutton( label=item, command=Call( MyCallback, "Bananas" ) )
>
> ------------------------------------------------------------------------------
> Also note that, for check and radio button options in specific, you can use
> Tk string and int variables, respectively, to communicate the value so your
> callback doesn't need arguments:
>
>     self.check_val = StringVar()
>     ...
>     menu.add_checkbutton( label=item, variable=self.check_val,
>                           command=self.CheckCB )
>     ...
>     def CheckCB( self ): print "variable is ", self.check_val.get()
>
> --
> Randall Hopper
> aa8vb at yahoo.com





More information about the Python-list mailing list