Foros Python

Versión completa: ttk.Entry pasar argumento a validatecommand (tkinter)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola gente, ¿cómo están?, seguramente el error lo comprenderán
de inmediato, les cuento lo que necesito, cada vez que la función
reciba un" "(barra espaciadora) que contenga(la lista) la palabra
(una a la vez).-
ej.: "Argentina" procesarla y reemplazar por la siguiente palabra.-


Código:
from tkinter import ttk
import tkinter as tk


def validate_entry(texto, palabra):
    palabra[0].append(texto)

    return True


def main():

    root = tk.Tk()
    root.config(width=300, height=200)
    root.title("Mi aplicación")

    palabra = ["", 0]


    entry = ttk.Entry(validate="key", validatecommand=(root.register(validate_entry), "%S", palabra))

    entry.focus()
    entry.place(x=50, y=50, width=150)
    root.mainloop()


if __name__ == '__main__':
    main()

Slds. Daniel ☕☕☕
Hola, Daniel.

Código:
palabra[0].append(texto)

¿Eso no debería ser de esta otra manera?


Código:
palabra.append(texto)

Si querés agregar el elemento al principio de la lista, debería usar palabra.insert(0, texto).

Saludos
Hola Francisco, gracias por tu tiempo.
Te muestro el error que causa cuando intento insertar una
letra en la caja:

Cita:Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Daniel Virgili\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\Daniel Virgili\Desktop\Practica\Corregir\módulo1.py", line 16, in validate_entry
    palabra.append(texto)
AttributeError: 'str' object has no attribute 'append'

Lo que necesito es saber por qué cuando creo (en el main)
la lista es un type lista, cuando hago lo mismo en la función
me da un tipo string ¿por qué?.-
Seguiré investigando...

Slds. Daniel ☕☕☕
Hola, Daniel.

Ahora me doy cuenta de que esta forma de pasar un parámetro es incorrecta:

Código:
validatecommand=(root.register(validate_entry), "%S", palabra)

De esa manera Tk convierte "palabra" a una cadena automáticamente. Debería hacerse con functools.partial(). En ese caso habría que cambiar el orden de los argumentos en la definición:

Código:
from functools import partial
from tkinter import ttk
import tkinter as tk

# Cambia el orden de los argumentos.
def validate_entry(palabra, texto):
    palabra.append(texto)
    return True

def main():
    root = tk.Tk()
    root.config(width=300, height=200)
    root.title("Mi aplicación")
    palabra = ["", 0]
    entry = ttk.Entry(
        validate="key",
        validatecommand=(
            root.register(partial(validate_entry, palabra)),
            "%S"
        )
    )
    entry.focus()
    entry.place(x=50, y=50, width=150)
    root.mainloop()

if __name__ == '__main__':
    main()

Saludos
Hola gente, un deseo de buen viernes para todos.
Gracias Francisco, ahora si funciona como era de esperar.-

Dejo la función para que alguien recién iniciado
quiere hacer algo parecido.-
Ahora me surgió otro inconveniente, si escribo
"Argentino" y debo escribir "Argentina" al pulsar
<retroceso> me queda de esta manera "Argentinooa"
No parece difícil solucionar esto, si me trabo te consulto...

Código:
def validate_entry(palabra, texto):
    if texto == " ":
        final = "".join(palabra)
        print(final)
        palabra.clear()
    else:
        palabra.append(texto)


Slds. Daniel ☕☕☕