J. Dru
J. Dru

Reputation: 93

Delete and Edit items in TreeView Tkinter

I want to delete a single row in a TreeView in Tkinter.

I know that this method:

def delButton(self):
    x = main.tree.get_children()
    for item in x:
        main.tree.delete(item)

deletes the whole tree. But I want to delete only one row. How can I do this?

Moreover, I want to know how to edit a TreeView row as well.

Upvotes: 9

Views: 46778

Answers (3)

    def delete_records(self):
       selection=self.tree.selection()[0] 
       self.tree.delete(selection)

Upvotes: 0

scotty3785
scotty3785

Reputation: 7006

Try something like this.

def delete(event):
    print('delete')
    selected_item = tree1.selection()[0]
    values = tuple(tree1.item(selected_item)['values'])
    print(dir(selected_item))
    print(selected_item)
    print(values)
    conn2 = sq.connect('Clients.db')
    c2 = conn2.cursor()
    query = "DELETE FROM clients WHERE name=? AND phone=?"
    c2.execute(query,(*values))
    conn2.commit()
    tree1.delete(selected_item)

We need to get the values associated with the selected item which is what the tree1.item(selected_item)['values'] section does.

Will need some modifications since you didn't provide a complete example of your code so I don't know what values are entered in to the treeview.

Upvotes: 1

VRage
VRage

Reputation: 1498

You are not deleting the whole tree you are just deleting all children from the root item, because you use delete for each item in your iteration. You can use a ifstatement to determine which item you want, or you can get the selected item with selected_item = tree.selection()[0] and delete it. With the .item()method you can full access to the item for modification. Example:

from Tkinter import Tk, Button
import ttk


root = Tk()

tree = ttk.Treeview(root)

tree["columns"]=("one","two")
tree.column("one", width=100 )
tree.column("two", width=100)
tree.heading("one", text="coulmn A")
tree.heading("two", text="column B")

tree.insert("" , 0,    text="Line 1", values=("1A","1b"))

id2 = tree.insert("", 1, "dir2", text="Dir 2")
tree.insert(id2, "end", "dir 2", text="sub dir 2", values=("2A","2B"))

##alternatively:
tree.insert("", 3, "dir3", text="Dir 3")
tree.insert("dir3", 3, text=" sub dir 3",values=("3A"," 3B"))

def edit():
    x = tree.get_children()
    for item in x: ## Changing all children from root item
        tree.item(item, text="blub", values=("foo", "bar"))

def delete():
    selected_item = tree.selection()[0] ## get selected item
    tree.delete(selected_item)

tree.pack()
button_del = Button(root, text="del", command=delete)
button_del.pack()
button_del = Button(root, text="edit", command=edit)
button_del.pack()

root.mainloop()

Upvotes: 10

Related Questions