使用for循环生成tkinter Treeview时如何设置唯一iid避免重复报错
问题原因
你遇到的报错核心是手动指定的Treeview条目iid重复,同时代码存在基础语法问题:
tree.insert()的第三个参数为条目iid,你写死为固定值"dir2",循环多次插入时会重复创建相同iid的条目,直接触发重复报错i+j = xxx是非法的Python变量赋值写法,不能直接拼接字符串作为变量名- 子条目插入时也写死了iid为
"dir 2"、"dir 3",同样会出现重复问题
修复方案
两种实现方式可按需选择:
方式1:不手动指定iid(最简便)
tree.insert()方法本身会返回创建条目的唯一iid,直接接收该返回值作为父节点标识即可,无需手动指定iid避免重复:
tree = ttk.Treeview(self.home_frame) tree["columns"] = ("one", "two") tree.column("one", width=100) tree.column("two", width=100) tree.heading("one", text="column A") tree.heading("two", text="column B") tree.insert("", 0, text="Line 1", values=("1A", "1b")) data = ['stocks','crypto','Forex','ETF','mutual funds'] n=1 for item in data: # 接收insert返回的父节点iid parent_iid = tree.insert("", n, text=item, values=("foo","bar")) # 子项插入时直接使用上面拿到的parent_iid作为父节点,不指定iid避免重复 tree.insert(parent_iid, "end", text="dir1", values=("2A", "2B")) tree.insert(parent_iid, "end", text="dir2", values=("2A", "2B")) n+=1 tree.grid(row=2,column=0)
方式2:手动指定唯一iid(适合后续需要按id查找条目的场景)
如果确实需要自定义iid方便后续操作,每次生成唯一的id值即可:
# 用enumerate同时拿索引和值,代码更简洁 for idx, item in enumerate(data, start=1): # 生成唯一的父节点iid parent_iid = f"parent_{idx}" tree.insert("", idx, iid=parent_iid, text=item, values=("foo","bar")) # 子节点也生成唯一iid tree.insert(parent_iid, "end", iid=f"child_{idx}_1", text="dir1", values=("2A", "2B")) tree.insert(parent_iid, "end", iid=f"child_{idx}_2", text="dir2", values=("2A", "2B"))
内容的提问来源于stack exchange,提问作者doctor_senpai69
相关产品推荐
相关产品推荐

