Python Tkinter una función de callback para dos botones

He estado buscando respuestas a esta pregunta durante mucho tiempo, pero aún no he encontrado nada. Estoy creando una GUI usando Tkinter, y tengo dos botones que hacen casi lo mismo, excepto que reciben información de diferentes widgets. Un botón es para un widget de entrada y el otro para un widget de cuadro de lista. La función de callback para estos dos botones es larga (aproximadamente 200 líneas), por lo que no quiero tener funciones separadas para cada botón. Tengo instrucciones if en el comienzo de esta función de callback para verificar en qué botón se hace clic, y luego los códigos tomarán el valor correspondiente. Pero no estoy seguro si el siguiente código muestra la forma correcta de hacerlo porque aparentemente no funciona perfectamente en mi progtwig. La función de callback solo funcionará por primera vez, y si hago clic en el otro botón, recibiré un error. Aquí hay un código de ejemplo que creé para ilustrar la idea. Tenga en cuenta que quiero comprobar si se hace clic en el botón, no quiero comprobar si existe el “valor”. Por favor ayuda.

from Tkinter import * root = Tk() def DoSomething(): # is this the right way to check which button is clicked? if button1: value = user_input.get() elif button2: value = choice.get(choice.curselection()[0]) # then more codes that take 'value' as input. button1 = Button(master,text='Search',command=DoSomething) button1.pack() button2 = Button(master,text='Search',command=DoSomething) button2.pack() user_input = Entry(master) user_input.pack() choice = Listbox(master,selectmode=SINGLE) choice.pack() #assume there are items in the listbox, I skipped this portion root.mainloop() 

Si desea pasar el widget real a la callback, puede hacerlo así:

 button1 = Button(master, text='Search') button1.configure(command=lambda widget=button1: DoSomething(widget)) button2 = Button(master, text='Search') button2.configure(command=lambda widget=button2: DoSomething(widget)) 

Otra opción es simplemente pasar una cadena literal si realmente no necesita una referencia al widget:

 button1 = Button(..., command=lambda widget="button1": DoSomething(widget)) button2 = Button(..., command=lambda widget="button2": DoSomething(widget)) 

Otra opción es darle a cada botón una callback única, y hacer que la callback haga solo lo que es exclusivo de ese botón:

 button1 = Button(..., command=ButtonOneCallback) button2 = Button(..., command=ButtonTwoCallback) def ButtonOneCallback(): value = user_input.get() DoSomething(value) def ButtonTwoCallback(): value=choice.get(choice.curselection()[0]) DoSomething(value) def DoSomething(value): ... 

Hay otras formas de resolver el mismo problema, pero esperamos que esto le brinde una idea general de cómo pasar los valores a la callback de un botón, o cómo puede evitar la necesidad de hacerlo en primer lugar.