json 从tkinter的树视图中删除选定项

eit6fx6z  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(130)

我有一个json,它在一个treeview中向我展示它的内容,目前我有一个函数,它可以选择项目并删除它,但它只在treeview中删除,而不在json中更新,我的问题是如何在这个函数中调用json来更新和删除所选的项目。
此函数删除树状视图中的项目

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

我试着调用json来读取它并写入这个函数。

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)

实际上,它删除了树视图中选定的行,但在控制台中,我得到了以下错误。

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,所以我想如果有人能给予我解决这个问题。
这是一个工作原理的例子
一个三个三个一个

kuuvgm7e

kuuvgm7e1#

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文件内的所有记录,并尝试在每次迭代中删除树视图中的第一个选中项。如果没有选中项,则会引发异常,因为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)

相关问题