Arguments for button command via Tkinter?

Ron Adam rrr at ronadam.com
Mon Oct 31 18:24:13 EST 2005



Steve Holden wrote:
> Francesco Bochicchio wrote:
> 
>> Il Mon, 31 Oct 2005 06:23:12 -0800, dakman at gmail.com ha scritto:
>>
>>
>>> And yet the stupidity continues, right after I post this I finnally
>>> find an answer in a google search, It appears the way I seen it is to
>>> create a class for each button and have it call the method within that.
>>> If anyone else has any other ideas please tell.
>>
>>
>>
>> This is  how I do it: Supposing I have three buttons b1, b2 and b3, and I
>> want for each button to call the same callback with, as argument, the
>> button itself:
>>
>>
>> def common_callback(button):
>>     # callback code here
>>
>>
>> class CallIt(objetc):
>>     def __init__(function, *args ):
>>         self.function, self.args = function, args
>>     def __call__(self, *ignore):
>>         self.function(button, *self.args)
>>
>> b1['command']= CallIt(common_callback, b1)
>> b2['command']= CallIt(common_callback, b2)
>> b3['command']= CallIt(common_callback, b3)
>>
>> This way you need only one class (a sort of custom callable) and
>> its instances gets called by Tkinter and in turn calls your
>> callback with the proper arguments.
>>
> I don't see why this is preferable to having the callback as a bound 
> method of the button instances. What's the advantage here? It looks 
> opaque and clunky to me ...

I'm not sure on the advantage either.  I just recently started handling 
my buttons with button id's.

     def __init__(self, *args, **kwds):
         ...

         b1 = Tk.Button( frame, text=button,
                         command=self.command(button) )
         ...

The button label is used as the id above, but a number or code could 
also be used.

     def command(self, id):
         """ Assign a command to an item.
             The id is the value to be returned.
         """
         def do_command():
             self.exit(event=id)
         return do_command

In this case it's a dialog button so it calls the exit method which sets 
self.return to the button id before exiting.

Cheers,
    Ron



More information about the Python-list mailing list