Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
ttk.Entry pasar argumento a validatecommand (tkinter)
#1
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 ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#2
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
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
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 ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#4
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
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#5
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 ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)