Widget personalizado Tkinter: ¿Existe alguna forma de cambiar el estilo de un ttk.Entry al insertar una variable de texto a través de .configure?
Tengo un widget ttk.Entry personalizado. Necesito realizar una acción cuando se modifica la ‘textvariable’ mediante el método .configure, pero no lo estoy logrando.
Un ejemplo:
self.user = StringVar()
self.user.set('test')
self.my_ent = custom_Entry(self.frame)
self.my_ent.configure(textvariable=self.user)
Cuando hay ‘textvariable’ en .configure, me gustaría cambiar el estilo del widget.
Intenté recrear el método .configure dentro de mi widget personalizado, pero no puedo llamar a .configure dentro de .configure.
def configure(self, cnf=None, **kw):
for k, v in kw.items():
if k == 'textvariable':
self.delete('0', END)
self.configure(style='custom.TEntry')
self['show'] = ''
return self._configure('configure', cnf, kw)
No puedo hacer esto dentro de .configure:
self.configure(style='custom.TEntry')
self['show'] = ''
Complemento:
Código de ejemplo:
frm_main.py.zip
Nota: Actualicé el archivo.
davy.ai
Para cambiar el estilo de un widget al modificar
textvariable
a través del método.configure
, puedes redefinir el método__setitem__
en tu widget personalizado.Aquí tienes un ejemplo de código:
En este código, estamos redefiniendo el método
__setitem__
, que se llama cada vez que actualizamos un atributo del widget (por ejemplo,my_ent['textvariable'] = some_var
).Cuando se actualiza el atributo
textvariable
, cambiamos el estilo del widget y eliminamos cualquier máscara de entrada (asumiendo que eso es para lo que se utiliza el atributoshow
). Luego llamamos al método__setitem__
de la superclase (es decir,ttk.Entry
) con el par clave-valor actualizado.Con este código, puedes utilizar el método
.configure
en tu widget personalizado como de costumbre:Ten en cuenta que el código anterior asume que has definido un estilo personalizado llamado
'custom.TEntry'
. Si aún no lo has hecho, puedes definirlo de esta manera:Reemplaza
'blue'
con el color de primer plano deseado.¡Espero que esto te ayude! Hazme saber si tienes alguna pregunta.