如何使 ttk.Treeview 可编辑?

How to make ttk.Treeview editable?

这里是编程初学者,我的任务是在 python 中完成有关 UI 的作业。该任务是一种创建、更新和删除系统(不包括数据库),但它必须具有 OOP。所以我决定在python中使用ttk.Treeview。创建和删除工作没有太多麻烦,但是当我尝试执行更新功能时,我迷路了,到目前为止我尝试过的 none 工作正常。

关于我尝试过的,我尝试将答案应用到How to make ttk.Treeview's rows editable?。但我无法理解,因为我仍然只是一个初学者 还有其他我看过的,都是用数据库的,这个作业是不允许的

至于我的代码,它相当短:

from tkinter import messagebox, ttk

employees = []

class Employees:

    def __init__(self, n, d, p, r):
        self.n = n
        self.d = d
        self.p = p
        self.r = r


def add():
    n = e1.get()
    d = e2.get()
    p = e3.get()
    r = e4.get()

    employees.append(Employees(n, d, p, r))

    tview.insert('', "end", text=n, values=(d, p, r))
    messagebox.showinfo("Add", "Successfully added")

def delete():
    selected_item = tview.selection()[0]
    tview.delete(selected_item)

def updatetreeview():
    # here where I am lost at I don't know what to do
    selected_item = tview.selection()[0]


master = Tk()

Label(master, text='Name').grid(row=0)
Label(master, text='Department').grid(row=1)
Label(master, text='Position').grid(row=2)
Label(master, text='Rate').grid(row=3)
tview = ttk.Treeview(master, columns=('Name', 'Position', 'Department','Rate'))
tview.grid(row=7, column=0, columnspan=10)

tview.heading('#0', text="Name")
tview.heading('#1', text="Department")
tview.heading('#2', text="Position")
tview.heading('#3', text="Rate")


e1 = Entry(master, width="30")
e2 = Entry(master, width="30")
e3 = Entry(master, width="30")
e4 = Entry(master, width="30")

e1.grid(row=0, column=1, pady=10)
e2.grid(row=1, column=1, pady=10)
e3.grid(row=2, column=1, pady=10)
e4.grid(row=3, column=1, pady=10)

b1 = Button(master, text="Add", width="25", command=add)
b1.grid(row=4, column=1, pady=10)
b2 = Button(master, text="Update", width="25")
b2.grid(row=5, column=1, pady=10)
b2 = Button(master, text="Delete", width="25", command=delete)
b2.grid(row=6, column=1, pady=10)
mainloop()

至于我的预期结果,我希望 table 中的选定行在按下按钮时更新。

我相信您要查找的词应该是 "updating" 一个 Treeview 项目而不是可编辑的。来自 the docs:

item(item, option=None, **kw)

Query or modify the options for the specified item.

If no options are given, a dict with options/values for the item is returned. If option is specified then the value for that option is returned. Otherwise, sets the options to the corresponding values as given by kw.

因此对于您的情况,您已经在 tview.selection()[0] 之前检索了 iid。使用item方法修改记录:

def updatetreeview():
    selected_item = tview.selection()[0]
    tview.item(selected_item,text=e1.get(), values=(e2.get(),e3.get(),e4.get()))

...

b2 = Button(master, text="Update", width="25",command=updatetreeview)

...

您更新row中内容的功能不完整,您正在使用treeview.selection()方法检索内容,之后您必须使用treeview item更新内容treeview.

已向更新函数添加exception处理以提示您select您要更新的错误,否则将输出错误。

添加或更新 treeview 后还必须清除条目。

from tkinter import messagebox, ttk
from tkinter import *

employees = []

class Employees:

    def __init__(self, n, d, p, r):
        self.n = n
        self.d = d
        self.p = p
        self.r = r


def add():
    n = e1.get()
    d = e2.get()
    p = e3.get()
    r = e4.get()


    employees.append(Employees(n, d, p, r))

    tview.insert('', "end", text=n, values=(d, p, r))
    messagebox.showinfo("Add", "Successfully added")

    e1.delete(0, END)
    e2.delete(0, END)
    e3.delete(0, END)
    e4.delete(0, END)


def delete():
    try:
        selected_item = tview.selection()[0]
        tview.delete(selected_item)
    except IndexError:
        pass


def updatetreeview():
    try:
        selected_item = tview.selection()[0]
        tview.item(selected_item, text=e1.get(), values=(e2.get(), e3.get(), e4.get()))
        print("updated")

        e1.delete(0, END)
        e2.delete(0, END)
        e3.delete(0, END)
        e4.delete(0, END)

    except IndexError:
        messagebox.showerror("Error","Select the row you want to update")



master = Tk()

Label(master, text='Name').grid(row=0)
Label(master, text='Department').grid(row=1)
Label(master, text='Position').grid(row=2)
Label(master, text='Rate').grid(row=3)
tview = ttk.Treeview(master, columns=('Name', 'Position', 'Department','Rate'))
tview.grid(row=7, column=0, columnspan=10)

tview.heading('#0', text="Name")
tview.heading('#1', text="Department")
tview.heading('#2', text="Position")
tview.heading('#3', text="Rate")


e1 = Entry(master, width="30")
e2 = Entry(master, width="30")
e3 = Entry(master, width="30")
e4 = Entry(master, width="30")

e1.grid(row=0, column=1, pady=10)
e2.grid(row=1, column=1, pady=10)
e3.grid(row=2, column=1, pady=10)
e4.grid(row=3, column=1, pady=10)

b1 = Button(master, text="Add", width="25", command=add)
b1.grid(row=4, column=1, pady=10)
b2 = Button(master, text="Update", width="25", command=updatetreeview)
b2.grid(row=5, column=1, pady=10)
b2 = Button(master, text="Delete", width="25", command=delete)
b2.grid(row=6, column=1, pady=10)

mainloop()