[ Foro de Python ]

acerca de __init__

24-Feb-2022 19:51
Invitado (ruso946)
1 Respuestas

Hola.
Tengo una duda con el siguiente codigo:

from tkinter import ttk
import tkinter as tk


class CheckbuttonForEntry(ttk.Checkbutton):
   """
   Checkbutton para deshabilitar un Entry.
   """
   def __init__(self, *args, **kwargs):
       self._var = tk.BooleanVar(value=True)
       kwargs["variable"] = self._var
       self.entry = kwargs.pop("entry")
       super().__init__(*args, **kwargs)
       self.config(command=self.clicked)
   
   def clicked(self):
       entry.config(state=tk.NORMAL if self._var.get() else tk.DISABLED)


root = tk.Tk()
entry = ttk.Entry()
checkbutton = CheckbuttonForEntry(
   text="Entry activado",
   entry=entry
)
entry2 = ttk.Entry()
checkbutton2 = CheckbuttonForEntry(
   text="Entry2 activado",
   entry=entry2
)
checkbutton.grid(row=0,column=0)
entry.grid(row=2, column=1)
checkbutton2.grid(row=1,column=0)
entry2.grid(row=3, column=1)

root.mainloop()

A grandes rasgos, entiendo que funciona haciendo que cada Checkbutton habilite o deshabilite un Entry,
Pero hay unas lineas en particular que no entiendo. De esta inicializacion:
def __init__(self, *args, **kwargs):
       self._var = tk.BooleanVar(value=True)
       kwargs["variable"] = self._var
       self.entry = kwargs.pop("entry")
       super().__init__(*args, **kwargs)
       self.config(command=self.clicked)

En particular estas lineas no las comprendo:
        kwargs["variable"] = self._var
       self.entry = kwargs.pop("entry")


Si alguien pudiera explicarlo, se agradece.
Saludos


03-Mar-2022 20:25
Invitado (rafa)

hola ruso

no tengo idea de tkinter vaya poca idea

pero lo que dices no saber es simplemente:

- añadir un elemento más al diccionario kwargs
      kwargs["variable"] = self._var

- y pop le da el valor de la llave entry del diccionario a
la variable entry de la instancia de clase y borra la llave del diccionario
      self.entry = kwargs.pop("entry")


espero te sirva de ayuda
suerte ;-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)