如何通过函数与循环为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
相关产品推荐
相关产品推荐

