python-3.x 如何使用函数和循环将值插入到Treeview中?(未插入)

7kjnsjlb  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(137)

我想将值4, 1, 7, 5, 9, 3插入到Treeviews的Badge列中,使用column = function()(而不是treeview.insert)和循环
如您所见,我解压缩了每个列表,然后用Rank = record[0], Name = record[1], and Badge = example()重新打包。我用的是values = datagrid。我知道有更好的方法,但我需要维护这段代码。
目前在Treeview的Badge列中,我看到4, 4, 4, 4, 4, 4。我想打印4, 1, 7, 5, 9, 3

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():

    def example():
        x  = [
            ["4"],
            ["1"],
            ["7"],
            ["5"],
            ["9"],
            ["3"],
            ]

        for a in x:
            return a

    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()
nbnkbykc

nbnkbykc1#

在函数中使用return,它将始终从一开始就运行函数中的所有代码,并且始终使用列表中的第一个元素。
您必须使用yield而不是return。它将创建generator,并且还需要next()从generator获取下一个值。

def example():
    x  = [
        ["4"],
        ["1"],
        ["7"],
        ["5"],
        ["9"],
        ["3"],
        ]

    for a in x:
        yield a

gen = example()   

for index, record in enumerate(data):
    Rank = record[0]
    Name = record[1]
    Badge = next(gen)

    # ... rest ...

您也可以直接在for中使用generator而不使用next()(它需要在for之后使用( )才能正确分配zip()中的值)

gen =  example()   

for (index, record), Badge in zip(enumerate(data), gen):
    Rank = record[0]
    Name = record[1]

    # ... rest ...

但坦率地说,我会直接使用x,而不创建example()

x  = [["4"],["1"],["7"],["5"],["9"],["3"],]

for (index, record), Badge in zip(enumerate(data), x):
    Rank = record[0]
    Name = record[1]

    # ... rest ...

相关问题