Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Mostrar los datos seleccionados de un treeview en otra ventana.
#1
Hola gente, hola Francisco ¿ cómo están?, les cuento lo que me ocurre,
tengo una ventana principal donde cuentos con los movimientos de una
caja de ahorro en 3 entry(fecha, detalle, monto y código que no lo muestro)
con el botón <Buscar> muestro un treeview con todos los movimientos
y con un botón(en la  ventana del treeview) <Mostrar> quiero que al
seleccionar me muestre el ítem en la ventana principal, ¿Cómo hago para lograrlo?

Código:
def seleccionar(mv, parametros):
    try:
        item = mv.selection()[0]
    except IndexError:
        messagebox.showwarning(message="Debe seleccionar un elemento.",
            title="No hay selección")
    else:
        text = mv.item(item, option="text")
        messagebox.showinfo(message=text, title="Selección")

Esto lo saque de tu tutorial, funciona muy bien pero me muestra solamente el código
y yo necesito guardar en una tupla los 4 campos para así modificar el contenido de la
pantalla principal.-
Bueno dejo 2 recortes de pantalla para que se entienda mejor.-

Por las dudas dejo esta parte del código porque me pareció que esto me serviría,
pero no se como implementarlo, el insert de mi código es distinto.

Código:
my_iid = "id_unico"
treeview.insert("", tk.END, text="Elemento 1", iid=my_iid)

Código:
    for mov in tmp:
        debeHaver = mov[3]
        if float(mov[3]) > 0:
            item = mv.insert("", END, text=mov[0], values=(mov[1], mov[2], "0.00 ", debeHaver))
        else:
            item = mv.insert("", END, text=mov[0], values=(mov[1], mov[2], debeHaver, "0.00 "))

https://postimg.cc/7GnqdwxB
https://postimg.cc/dZRZ5zXv

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ómo estás?

Cambiá esta línea:

  1. text = mv.item(item, option="text")


por:

  1. data = mv.item(item)


De esta manera recibís en data un diccionario con todas las columnas del elemento seleccionado. Luego tirar esos datos en los controles de la ventana principal no debería ser problemático. Si no tenés referencias a esos controles (porque están en otro archivo o algo por el estilo), podés usar functools.partial() como te había mencionado en alguna otra ocasión (acá hay un ejemplo).

Saludos
Responder
#3
Hola Francisco, muy bien, tanto renegar y con cambiar una línea todo solucionado, gracias.-
Aprovecho para consultarte, ¿te paso alguna vez que la segunda vez que pulsas un botón
no hace lo esperado?, invoca a la función pero la segunda vez no cierra la ventana.-
Te dejo la función y si no entendes lo de “parametros” es que tengo la particularidad de poner
todos los parámetros en una lista.-

Código:
def seleccionar(mv, parametros):
    try:
        item = mv.selection()[0]
    except IndexError:
        messagebox.showwarning(message="Debe seleccionar un elemento.",
            title="No hay selección")
    else:
        data = mv.item(item)
        parametros[0].set(data["values"][0])
        parametros[1].set(data["values"][1])
        if float(data["values"][2]) < 0:
            parametros[2].set(data["values"][2])
        else:
            parametros[2].set(data["values"][3])
       
        parametros[10][0] = data["text"]
        parametros[10][1] = data["values"][0]
        parametros[10][2] = data["values"][1]
        parametros[10][3] = data["values"][2]

        parametros[14].destroy()
   
    return True 

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.

¿No arroja ningún error la segunda vez que lo presionás? Tal vez en parametros[14] tenés una referencia vieja a una ventana que ya no existe.

Saludos
Responder
#5
Hola Francisco, feliz Domingo, lo único que encuentro es que pongo:
--------------------------------------------
parametros.append(ventanaBus)
-------------------------------------------- 
y luego aparece:
-------------------------------------------- 
al inicio  !toplevel
En la función .!toplevel
--------------------------------------------
Debe ser correcto ¿no?

En cuanto a lanzar un error todo lo contrario, me fijo en la ventana
principal y los datos seleccionado aparecen instantáneamente.-

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
#6
Bueno con una manera que desconocía pero lo solucione,
cierro la ventana desde el mismo botón y no desde la función.-

--------------------------------------------------
command= lambda:[seleccionar(mv, parametros), ventanaBus.destroy()])
--------------------------------------------------

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
#7
Excelente, Daniel.

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)