You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Tkinter可编辑Treeview的确认改为回车键替代OK按钮

Tkinter Treeview 用回车键替代OK按钮保存编辑内容

要实现双击进入编辑后按回车键保存修改,只需要给编辑用的Text组件绑定回车键事件,同时可按需移除多余的OK按钮。以下是修改后的完整代码:

from tkinter import ttk
from tkinter import *
root = Tk()
columns = ("Items", "Values")
Treeview = ttk.Treeview(root, height=18, show="headings", columns=columns)
Treeview.column("Items", width=200, anchor='center')
Treeview.column("Values", width=200, anchor='center')
Treeview.heading("Items", text="Items")
Treeview.heading("Values", text="Values")
Treeview.pack(side=LEFT, fill=BOTH)
name = ['Item1', 'Item2', 'Item3']
ipcode = ['10', '25', '163']
for i in range(min(len(name), len(ipcode))):
    Treeview.insert('', i, values=(name[i], ipcode[i]))

def treeview_sort_column(tv, col, reverse):
    l = [(tv.set(k, col), k) for k in tv.get_children('')]
    l.sort(reverse=reverse)
    for index, (val, k) in enumerate(l):
        tv.move(k, '', index)
    tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse))

def set_cell_value(event):
    for item in Treeview.selection():
        item_text = Treeview.item(item, "values")
        column = Treeview.identify_column(event.x)
        row = Treeview.identify_row(event.y)
    cn = int(str(column).replace('#', ''))
    rn = int(str(row).replace('I', ''))
    entryedit = Text(root, width=10 + (cn - 1) * 16, height=1)
    entryedit.place(x=16 + (cn - 1) * 130, y=6 + rn * 20)
    
    # 自动填充当前单元格原有内容
    entryedit.insert(0.0, Treeview.set(item, column))
    
    def saveedit():
        # 移除Text组件获取内容时自带的换行符
        new_value = entryedit.get(0.0, "end").strip()
        Treeview.set(item, column=column, value=new_value)
        entryedit.destroy()

    # 绑定回车键触发保存操作
    entryedit.bind('<Return>', lambda e: saveedit())
    # 可选:若不需要OK按钮,直接注释掉下面两行即可
    # okb = ttk.Button(root, text='OK', width=4, command=saveedit)
    # okb.place(x=90 + (cn - 1) * 242, y=2 + rn * 20)

def newrow():
    name.append('to be named')
    ipcode.append('value')
    Treeview.insert('', len(name) - 1, values=(name[len(name) - 1], ipcode[len(name) - 1]))
    Treeview.update()
    newb.place(x=120, y=(len(name) - 1) * 20 + 45)
    newb.update()

Treeview.bind('<Double-1>', set_cell_value)
newb = ttk.Button(root, text='new item', width=20, command=newrow)
newb.place(x=120, y=(len(name) - 1) * 20 + 45)
for col in columns:
    Treeview.heading(col, text=col, command=lambda _col=col: treeview_sort_column(Treeview, _col, False))
root.mainloop()

核心修改点:

  • 给编辑用的entryedit组件绑定<Return>事件,触发保存函数
  • 在保存时用strip()清理Text组件自带的换行符,避免Treeview出现多余空行
  • 新增自动填充原有单元格内容的逻辑,优化编辑体验
  • 保留了OK按钮的可选性,可根据需求决定是否保留

内容的提问来源于stack exchange,提问作者Prashant Priyadarshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:57:39