es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

Imagen

Código de ejemplo:
frm_main.py.zip
Nota: Actualicé el archivo.

Tags:  , ,

Answer

  1. Avatar for 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:

    class custom_Entry(ttk.Entry):
        def __init__(self, master=None, **kw):
            super().__init__(master, **kw)
    
        def __setitem__(self, key, value):
            if key == 'textvariable':
                # cambiar el estilo al modificar textvariable
                self.configure(style='custom.TEntry')
                self['show'] = ''
    
            super().__setitem__(key, value)
    

    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 atributo show). 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:

    self.user = StringVar()
    self.user.set('test')
    self.my_ent = custom_Entry(self.frame)
    self.my_ent.configure(textvariable=self.user)
    

    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:

    style = ttk.Style()
    style.configure('custom.TEntry', foreground='blue')
    

    Reemplaza 'blue' con el color de primer plano deseado.

    ¡Espero que esto te ayude! Hazme saber si tienes alguna pregunta.

Comments are closed.