python tkinter中treeview双击列表可修改列值

效果如下图:

import tkinter as tk
from tkinter import ttk

def set_cell_combobox(event, value):
    def change_value(_):
        combobox.destroy()
        old_value[col] = combobox_var.get()
        tree.item(row, value=old_value)

    def leave(e):
        """当鼠标点击combobox的箭头时,也被认为是离开控件,所以要对离开事件进行区分"""
        if e.state == 8:
            combobox.destroy()
        else:
            combobox.unbind('<FocusOut>')

    def focusout(_):
        """当combobox的列表被打开,并且没有选取任何选项,此时光标会自动回到combobox控件,可以利用combobox的这个特性,当光标回到控件时,自动获得此方法"""
        combobox.bind('<FocusOut>', lambda _: combobox.destroy())

    column = tree.identify_column(event.x)
    row = tree.identify_row(event.y)
    col = int(column.split('#')[1]) - 1
    old_value = list(tree.item(row, 'value'))
    print(column,row,col,old_value)
    cell_coord = tree.bbox(row, column=column)
    print(cell_coord)
    combobox_var = tk.StringVar()
    combobox = ttk.Combobox(tree, width=int(cell_coord[2] / 7) - 2, textvariable=combobox_var)
    combobox['value'] = value
    combobox.place(x=cell_coord[0] - 2, y=cell_coord[1], anchor='nw')
    combobox.insert(0, old_value[col])
    combobox.focus_set()
    combobox.bind('<<ComboboxSelected>>', change_value)
    combobox.bind('<Leave>', leave)
    combobox.bind('<FocusIn>', focusout)

root=tk.Tk()
tree = ttk.Treeview(root, show='headings')
tree['columns'] = ['A', 'B', 'C']
tree.heading('#1', text='A')
tree.heading('#2', text='B')
tree.heading('#3', text='C')
tree.insert('', 'end', text='第一行', value=['1','2','3'])
tree.insert('', 'end', text='第二行', value=['2','3','4'])
value_l=['a','b','c']
tree.bind('<Double-1>', lambda event:set_cell_combobox(event, value=value_l))
tree.pack()
root.mainloop()

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python,要实现双击编辑更改TreeView表格的值,可以使用tkinterTreeview组件以及绑定事件的方法。 以下是一个示例代码,用于创建一个带有TreeView表格的窗口,可以通过双击表格的单元格来编辑单元格的值: ```python import tkinter as tk from tkinter import ttk class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) self.master = master self.pack() self.create_widgets() def create_widgets(self): # 创建Treeview表格 self.tree = ttk.Treeview(self) self.tree["columns"] = ("one", "two") self.tree.column("one", width=100) self.tree.column("two", width=100) self.tree.heading("one", text="Column 1") self.tree.heading("two", text="Column 2") self.tree.insert("", "end", text="Row 1", values=("1A", "1B")) self.tree.insert("", "end", text="Row 2", values=("2A", "2B")) self.tree.bind("<Double-1>", self.OnDoubleClick) # 绑定双击事件 self.tree.pack() def OnDoubleClick(self, event): # 获取选的单元格 item = self.tree.selection()[0] column = self.tree.identify_column(event.x) # 开始编辑单元格 self.tree.item(item, values=("New Value", "New Value"), text="") self.tree.focus(item) self.tree.selection_set(item) self.tree.set(item, column, "") root = tk.Tk() app = Application(master=root) app.mainloop() ``` 在这个示例,我们使用了`ttk.Treeview`来创建一个带有两列的表格,并将其绑定到`self.tree`变量。我们还使用了`self.tree.bind("<Double-1>", self.OnDoubleClick)`来绑定一个双击事件,当用户双击某一单元格时,会调用`OnDoubleClick`方法来开始编辑单元格。在`OnDoubleClick`方法,我们使用了`self.tree.selection()`来获取选的单元格,使用`self.tree.identify_column(event.x)`来获取用户双击的列,然后使用`self.tree.item(item, values=("New Value", "New Value"), text="")`来开始编辑单元格。最后,我们使用`self.tree.set(item, column, "")`将单元格的值设置为空,以等待用户输入新值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值