[英]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.