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

如何通过函数与循环为Treeview的Badge列插入指定值(不使用treeview.insert)

问题解决:Treeview Badge列依次显示指定值

原代码中Badge列全显示4的原因是example()函数每次被调用时,都会从头遍历列表x并立即返回第一个元素["4"],无法依次获取后续值。以下是保留现有代码结构的修改方案:

修改后的完整代码

from tkinter import *
from tkinter import ttk

ws = Tk()
ws.title('PythonGuides')
ws.geometry('400x300')
ws['bg']='#fb0'

data  = [
    [1,"Jack"],
    [2,"Tom"],
    [3,"Daniel"],
    [4,"Leonard"],
    [5,"Frank"],
    [6,"Robert"],
    ]

tv = ttk.Treeview(ws)
tv['columns']=('Rank', 'Name', 'Badge')
tv.column('#0', width=0, stretch=NO)
tv.column('Rank', anchor=CENTER, width=80)
tv.column('Name', anchor=CENTER, width=80)
tv.column('Badge', anchor=CENTER, width=80)
tv.heading('#0', text='', anchor=CENTER)
tv.heading('Rank', text='Id', anchor=CENTER)
tv.heading('Name', text='rank', anchor=CENTER)
tv.heading('Badge', text='Badge', anchor=CENTER)
tv.pack()


def func1():
    # 初始化徽章值的迭代器,确保每次调用example()返回下一个值
    badge_values = ["4", "1", "7", "5", "9", "3"]
    badge_iter = iter(badge_values)

    def example():
        # 每次调用返回迭代器的下一个元素
        return next(badge_iter)

    for index, record in enumerate(data):
        Rank = record[0]
        Name = record[1]
        Badge = example()
        
        datagrid = [Rank, Name, Badge]
        tv.insert(parent='', index='end', values=(datagrid))

   
button = Button(ws, text="Button", command = func1)
button.place(x=1, y=1)

ws.mainloop()

关键修改点

  • 在func1内部创建徽章值的迭代器badge_iter,利用闭包让example()函数可以访问并逐步获取下一个值
  • 移除原example()函数内的无效循环,改为直接返回迭代器的下一个元素
  • 简化徽章值的列表结构(从嵌套列表改为普通字符串列表),避免Treeview显示列表格式的内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:07:22