Foros Python

Versión completa: Buscar un ítem en un treeview (tkinter)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola Francisco, ¿Cómo estas?, hola gente.-
Estoy un poco lidiado con este tema y x mas que busco en tu blog,
practico, pero no logro el resultado esperado.-
Te comento(se entiende mejor en el recorte de pantalla) con un botón
tengo que borrar un ítem del treeview pero no se como buscarlo,
¿ cómo lo hago?.-
Desde ya gracias porque confío mucho en tus respuestas.-

https://postimg.cc/gnvXR5v5

Slds. Daniel ☕☕☕

Si es algo similar a esto, ya esta, me lo habías enseñado en otro hilo, perdón.-

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

Slds. Daniel ☕☕☕
Hola, Daniel, ¿cómo estás?

¿Pudiste solucionarlo con ese código? Eso serviría para borrar el elemento seleccionado. Si querés eliminar algún otro item, tenés que guardar previamente la referencia al mismo al momento de insertarlo. La función insert() del treeview devuelve una cadena que funciona como referencia a cada item que se inserta, y es precisamente lo que necesita el método delete() para borrar un item. Una práctica adecuada sería, luego de cada insert(), agregar el ID del item a una lista que refleje exactamente los ID de todos los items en el treeview.

Saludos
Hola.
Buscando nformacon para mi problema, me encontre con esto que me llamo la atencion.
Si no es un atrevimiento de mi parte y con el afan de ayudar, tengo un programa que hace busquedas en una tabla (TREEVIEW).
Aqui te lo pongo (pego) y si deseas alguna aclaratoria, estoy a la orden y con mucho gusto.

Código:
## Esta funcion verifica si el concepto que se trata de incluir ya existe en la tabla
## (TREEVIEW), de ser asi se procede a modificar sus datos
def elconceptoexisteenlatabla (concepto):
    global tabla, secuencia
    if secuencia == 0: return False, 0  ## la tabla esta vacia
    for item in tabla.get_children():
        valores = tabla.item(item)['values']
        # print ('item:',item,'valores:',valores)
        con = tabla.item(item,'text')  ##  str(valores[0]).rjust(3,'0')
        # print ('elconceptoexisteenlatabla:',con,type(con),'concepto:',concepto)
        if con == concepto:
            # print ('se consiguio el concepto',con,concepto)
            return True, item
    return False, 0

Espero que te ayude.
Un saludo
Cita:¿Pudiste solucionarlo con ese código? Eso serviría para borrar el elemento seleccionado.
Si querés eliminar algún otro item, tenés que guardar previamente la referencia al mismo
al momento de insertarlo. La función insert() del treeview devuelve una cadena que
funciona como referencia a cada item que se inserta, y es precisamente lo que necesita
el método delete() para borrar un item. Una práctica adecuada sería, luego de cada insert(),
agregar el ID del item a una lista que refleje exactamente los ID de todos los items en el treeview.
   

No te darás una idea del barullo que tengo con este tema que hace mas de una semana
que me da “vueltas” en la cabeza y no se como preguntarte.-
Lo voy a intentar,  si te parece que cometo una infantilismo discúlpame.-
Si yo tengo una base de datos con 100 registros correlativos(o no) seguramente me
resultara un tanto fácil encontrar el registro deseado, pero si tengo un treeview y esto
como referencia, ¿me podes decir como lo busco?.-

---------------------------------
I001      I00B      I015
I00C      I002      I016
I00D      I003      I017
I00E      I004      I018
I00F      I005      I019
I010      I006      I01A
I011      I007      I01B
I012      I008      I01C
I013      I009      I01D
I014      I00A      I01E
---------------------------------

Slds. Daniel ☕☕☕
Hola, Daniel.

Si en la lista tenés solo guardado el ID, no va a ser posible realizar una búsqueda. Deberías guardar, además del ID, también el resto de los datos. Pero eso implicaría duplicar los datos en memoria (porque los tendrías en tu lista y a su vez Tk los tendría en la memoria del treeview). La solución que dejó Francisco (el otro Francisco) me parece más adecuada. Con un bucle recorrés los items hasta encontrar el que estás buscando. Por ejemplo, si hacés una búsqueda por fecha, y querés borrar todos los items con fecha 28/04/2021, deberías hacer algo así:

Código:
for item_id in treeview.get_children():
    columnas = treeview.item(item_id)["values"]
    if columnas[0] == "28/04/2021":
        treeview.delete(item_id)

Saludos
Hola, buen día para todos.
Gracias Francisco, es eso exactamente lo que buscaba(lo guarde en un cofre) .-
Justamente en el programa que estoy haciendo hay una búsqueda y como
desconocía esta manera la efectuaba desde el .txt(BD) directamente.-
Dejo esta práctica por si alguno le resulta útil…

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

def centrarVentana(ventana):
    ancho_ventana = 550
    alto_ventana = 500

    x_ventana = ventana.winfo_screenwidth() // 2 - ancho_ventana // 2
    y_ventana = ventana.winfo_screenheight() // 2 - alto_ventana // 2

    posicion = str(ancho_ventana) + "x" + str(alto_ventana) + "+" + str(x_ventana) + "+" + str(y_ventana)
    ventana.geometry(posicion)

    ventana.resizable(0,0)

def crearTrw(registros):
    with codecs.open('BDsuper.txt', 'r', encoding='utf-8') as archivo:
        for linea in archivo:
            tmpLinea = linea.strip()
            linea = tmpLinea.split(',')
            registros.append(linea)
          
    return registros

def busqueda(mv):
    fInicio = time.strptime("28/04/2021", "%d/%m/%Y")
    fTope = time.strptime("28/05/2021", "%d/%m/%Y")  
    for item_id in mv.get_children():
        columnas = mv.item(item_id)["values"]
        fmv = time.strptime(columnas[0], "%d/%m/%Y")
        if fmv >= fInicio and  fmv <= fTope:
            final = f"{columnas[0] } {columnas[1]} {columnas[2]}"  
            print(final)


def main():  
    root = tk.Tk()
    root.title(" Cuenta corriente del Súper.")
    centrarVentana(root)

    # Creando las columnas.
    mv = ttk.Treeview(root, columns=("col1", "col2", "col3"))
    mv.column("#0", width=6, anchor=SE)
    mv.column("col1", width=10, anchor=CENTER)
    mv.column("col2", width=50, anchor=NW)
    mv.column("col3", width=10, anchor=CENTER)

  
    # Poniendo en nombre a las columnas.
    mv.heading("#0", text="Código", anchor=CENTER)
    mv.heading("col1", text="Fecha", anchor=CENTER)
    mv.heading("col2", text="Descripción", anchor=CENTER)
    mv.heading("col3", text="Monto", anchor=CENTER)

  
    # Poner todos los registros en una lista.
    registros = []
    crearTrw(registros)

    # Poner todos los registros en el treeview.  
    for reg in registros:
        item = mv.insert("", END, text=reg[0], values=(reg[1], reg[2], reg[3]))
    registros.clear()  
  
  
    # posicionar el "Treeview" y creando el "Scrollbar".
    ejscrollbar= ttk.Scrollbar(root,orient=VERTICAL,command=mv.yview)
    ejscrollbar.pack(side='right',fill='y')
    mv.configure(yscrollcommand=ejscrollbar.set)
    mv.place(x=15, y=10, height=350,width=500)
  
  
    # Botón <Buscar>
    botonBuscar = ttk.Button(root, text="Buscar",
        command=partial(busqueda, mv))
    botonBuscar.place(x=230, y=400, width=80, height=40)

    mv.focus()
  
    root.mainloop()

main()



Slds. Daniel ☕☕☕
Excelente, Daniel.

Saludos!