comandos en tkinter cuándo usar lambda y devoluciones de llamada

Estoy confundido en cuanto a la diferencia entre usar una función en los comandos de los elementos tkinter. digamos que tengo self.mb_BO.add_radiobutton(label= "Red", variable=self.BO, value=2, command=self.red) cuál es la diferencia en la forma en que funciona la sentencia add: self.mb_BO.add_radiobutton(label= "Red", variable=self.BO, value=2, command=self.red()) donde func red (self) cambia el color a rojo. Y self.mb_BO.add_radiobutton(label= "Red", variable=self.BO, value=2, command=lambda: self.red())

Esencialmente no entiendo qué hacen estos comandos y cuándo usar la callback o la referencia de función. He pasado horas buscando un resumen fácil de seguir en vano y todavía estoy igual de confundido.

Una buena manera de verlo es imaginar el botón o el enlace que le pregunta “¿qué comando debo llamar cuando se hace clic en el botón?”. Si le das algo como self.red() , no le estás diciendo qué comando ejecutar, en realidad estás ejecutando el comando. En su lugar, debe darle el nombre (o, más exactamente, una referencia ) de una función.

Recomiendo esta regla de oro: nunca uses lambda. Como todas las buenas reglas de oro, solo se aplica mientras tenga que hacer la pregunta. Una vez que entiendas por qué debes evitar lambda, está bien usarlo siempre que tenga sentido.

command=self.red vincula la función a ese widget. command=self.red() vincula el valor de retorno de esa función a ese widget. No quiere que su widget intente llamar, digamos, un número o una cadena, quiere que llame a una función. Si desea que el widget llame a una función con un argumento, entonces usaría un lambda :

 command=lambda x=None: print('hello world')