Python 如何使ttk.Treeview可编辑?

Python 如何使ttk.Treeview可编辑?,python,tkinter,treeview,ttk,Python,Tkinter,Treeview,Ttk,作为这里的编程初学者,我的任务是做一个关于python中UI的家庭作业。该任务是一种创建、更新和删除系统(不包括数据库),但它必须具有OOP。所以我决定在python中使用ttk.Treeview。让create和delete正常工作并没有太大困难,但当我尝试执行更新功能时,我失败了,到目前为止,我尝试过的功能都不起作用 关于我试过的那些,我试着把答案应用到它们身上。但我不能理解它,因为我还只是一个初学者 我见过的每一个都使用数据库,这是本作业中不允许的 至于我的代码,它相当短: from tk

作为这里的编程初学者,我的任务是做一个关于python中UI的家庭作业。该任务是一种创建、更新和删除系统(不包括数据库),但它必须具有OOP。所以我决定在python中使用
ttk.Treeview
。让create和delete正常工作并没有太大困难,但当我尝试执行更新功能时,我失败了,到目前为止,我尝试过的功能都不起作用

关于我试过的那些,我试着把答案应用到它们身上。但我不能理解它,因为我还只是一个初学者 我见过的每一个都使用数据库,这是本作业中不允许的

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

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()

至于我的预期结果,我希望按下按钮后,表中选定的行将被更新。

我认为您要查找的单词应该是“更新”一个
Treeview
项,而不是“可编辑”。发件人:

项目(项目,选项=无,**千瓦)

查询或修改指定项的选项

如果未给出任何选项,则返回带有该项的选项/值的dict。如果指定了选项,则该选项的值为 返回。否则,将选项设置为相应的值,如下所示: 由千瓦给出

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

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)

...

更新
行中内容的功能不完整,您正在使用
treeview.selection()
方法检索内容,然后您必须使用
treeview item
更新
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()
已将异常处理添加到更新功能中,以提示您选择要更新的错误,否则将输出错误

在添加或更新
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()

我看不出这个问题与你链接的问题有什么不同。为什么我们要把它打开,而不是像复制品一样关闭?哇,太谢谢你了!!它就像一个符咒,我在那里真的遇到了麻烦,你真是天赐之物,谢谢你帮助这个noob。谢谢你补充的信息,现在我可以向我的老师解释清楚了。