繁体   English   中英

删除tkinter中treeview选中的项目

[英]Delete item selected from treeview in tkinter

我有一个 json 在 treeview 中显示它的内容。目前我有一个 function 选择该项目并将其删除,但它只在 treeview 中删除它并且它没有在 json 中更新。我的问题是如何调用json 在此 function 更新和删除所选项目。

这个 function 删除了 treeview 中的项目

def borrar_select():
        borrar1 = json_tree.selection()[0]
        json_tree.delete(borrar1)

我试过打电话给json在这个function里读写。

def borrar_select():
    with open('prueba1.json', "r") as f:
        data = json.load(f)

    for record in data['Clientes']:
        borrar1 = json_tree.selection()[0]
        json_tree.delete(borrar1)

    with open('prueba1.json', "w") as f:
        json.dump(record,f,indent=4)

实际上,它删除了 treeview 中的选定行,但在控制台中出现以下错误。

PS C:\Users\*\Desktop\Tkinter> & E:/Prog/Python3/Python311/python.exe c:/Users/*/Desktop/Tkinter/test1.py
Exception in Tkinter callback
Traceback (most recent call last):
  File "E:\Prog\Python3\Python311\Lib\tkinter\__init__.py", line 1948, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "c:\Users\*\Desktop\Tkinter\test1.py", line 102, in borrar_select
    borrar1 = json_tree.selection()[0]
              ~~~~~~~~~~~~~~~~~~~~~^^^
IndexError: tuple index out of range

因此,修改也不会保存在 json 中。

我最近使用 python,所以我希望有人能帮我解决这个问题。

这是它如何工作的一个例子

import json
from tkinter import ttk
from tkinter import *
import tkinter as tk

ventana = tk.Tk()
ventana.title("Test")
ventana.geometry("1000x600")

frame1 = tk.Frame(ventana, bg="green", height=300, width=700)
frame1.grid(row=1, column=0)

frame2 = tk.Frame(ventana, bg="yellow", height=300, width=700)
frame2.grid(row=2, column=0)

frame_entry = tk.Frame(frame2) #Frame para los entry
frame_entry.pack(pady=20)
    
tree_frame = tk.Frame(frame1) #Frame para el arbol
tree_frame.pack(pady=20)

#style del tree
style = ttk.Style()
style.theme_use("clam")
style.configure("Treeview", background="#c7c7c7", foreground="black", rowheight=25,fieldbackground="#a1a1a1")
style.map("Treeview", background=[('selected','green')])

tree_scroll = Scrollbar(tree_frame) #Frame para el scrollbar del arbol
tree_scroll.pack(side=RIGHT, fill=Y)
#Lista Treeview
json_tree = ttk.Treeview(tree_frame, yscrollcommand=tree_scroll.set)
json_tree.pack()

#config scroll
tree_scroll.config(command=json_tree.yview)

#Definir columnas
json_tree['column'] = ("Logo", "Name", "Last Name", "Something")

#Formato columnas
json_tree.column("#0", width=0, minwidth=0)#Columna Fantasma
json_tree.column("Logo", anchor="w", width=120)
json_tree.column("Name", anchor="w", width=120)
json_tree.column("Last Name", anchor="w", width=120)
json_tree.column("Something", anchor="w", width=120)


#headings
json_tree.heading("#0", text="", anchor="w")#Columna Fantasma
json_tree.heading("Logo", text="Logo", anchor="w")
json_tree.heading("Name", text="Name", anchor="w")
json_tree.heading("Last Name", text="Last Name", anchor="w")
json_tree.heading("Something", text="Something", anchor="w")


#color rows
json_tree.tag_configure('par', background="#fff")
json_tree.tag_configure('inpar', background="#d6d6d6")
    
#Abrir y leer json para acceder a las propiedades en el objeto

with open('prueba1.json', "r") as f:
    data = json.load(f)

    count=0
    for record in data['Clientes']:
        if count % 2 ==0:
            json_tree.insert(parent='', index="end", iid=count, text="", values=(record['Logo'],record['Name'],record['Last Name'],record['Something']), tags=('par',))
        else:    
            json_tree.insert(parent='', index="end", iid=count, text="", values=(record['Logo'],record['Name'],record['Last Name'],record['Something']), tags=('inpar',))

        count+=1
   

#entrys
l1 = Label( frame_entry, text="Logo")
l1.grid(row=0, column=0)
logo_lb = Entry( frame_entry)
logo_lb.grid(row=1, column=0)

l2 = Label( frame_entry, text="Name")
l2.grid(row=0, column=1)
name_lb = Entry(frame_entry)
name_lb.grid(row=1, column=1)

l3 = Label( frame_entry, text="Last Name")
l3.grid(row=0, column=2)
lastname_lb = Entry(frame_entry)
lastname_lb.grid(row=1, column=2)

l4 = Label( frame_entry, text="Something")
l4.grid(row=0, column=3,)
something_lb = Entry(frame_entry)
something_lb.grid(row=1, column=3)

#funciones de los botones
def borrar_select():
    with open('prueba1.json', "r") as f:
        data = json.load(f)

    for record in data['Clientes']:
        borrar1 = json_tree.selection()[0]
        json_tree.delete(borrar1)

    with open('prueba1.json', "w") as f:
        json.dump(record,f,indent=4)

#Limpiar las cajas
    logo_lb.delete(0,END) 
    name_lb.delete(0,END)
    lastname_lb.delete(0,END)
    something_lb.delete(0,END)
            
borrar_btn = tk.Button(frame2, text="Delete", command=borrar_select)
borrar_btn.pack(side=RIGHT, ipadx=30, pady=10)

def select_record():
    #Limpiar las cajas
    logo_lb.delete(0,END) 
    name_lb.delete(0,END)
    lastname_lb.delete(0,END)
    something_lb.delete(0,END)

    selected = json_tree.focus() #numero de la posicion del record en el tree
    values = json_tree.item(selected,'values') #con la posicion seleccionada, toma el valor del mismo

    logo_lb.insert(0, values[0]) 
    name_lb.insert(0,values[1])
    lastname_lb.insert(0,values[2])
    something_lb.insert(0,values[3])

        
select_btn = tk.Button(frame2, text="Select", command=select_record)
select_btn.pack(side=LEFT, ipadx=30,)

ventana.mainloop()
{
  "Clientes": [
    {
      "Logo": "C:/Users/*/Desktop/Tkinter/logos/selavalacarita.png",
      "Name": "2",
      "Last Name": "3",
      "Something": "4"
    },
    {
      "Logo": "C:/Users/*/Desktop/Tkinter/logos/selavalacarita.png",
      "Name": "1",
      "Last Name": "4",
      "Something": "7"
    }
  ]
}

borrar_select()中的以下代码:

    with open('prueba1.json', "r") as f:
        data = json.load(f)

    for record in data['Clientes']:
        borrar1 = json_tree.selection()[0]
        json_tree.delete(borrar1)

将遍历 JSON 文件中的所有记录,并尝试在每次迭代中删除 treeview 中的第一个选定项目。 如果没有选择项目,它将引发异常,因为json_tree.selection()将返回空元组。 即使选择了一项,在第二次迭代中也会引发异常,因为所选项目已被删除。

您可以简单地使用json_tree.delete(...)删除选定的项目,然后将剩余的项目保存到文件中:

# funciones de los botones
def borrar_select():
    selections = json_tree.selection()
    if selections:
        # remove selected items from treeview
        json_tree.delete(*selections)
        # get the records from treeview to as list of dictionaries
        fields = ["Logo", "Name", "Last Name", "Something"]
        records = [dict(zip(fields,json_tree.item(iid,"values"))) for iid in json_tree.get_children()]
        # save the list of dictionaris to file
        with open('prueba1.json', 'w') as f:
            json.dump({'Clientes': records}, f, indent=4)

    # Are below lines necessary?
    #Limpiar las cajas
    logo_lb.delete(0, END)
    name_lb.delete(0, END)
    lastname_lb.delete(0, END)
    something_lb.delete(0, END)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM