从tkinter的树形视图中获取数据

3
我正在尝试从一个填充了数据的Treeview中获取数据:
self.tree['show'] = 'headings'
    self.tree['columns'] = ('Pool ID','Time', 'Lat', 'Lon', 'Alt', 'Spd', 'hdop','vdop','pdop', 'Sats Used', 'FixMode')
    self.tree.column('Pool ID', width=90, anchor='center')
    self.tree.heading('Pool ID', text='Pool ID')
    self.tree.column('Time', width=90, anchor='center')
    self.tree.heading('Time', text='Time')
    self.tree.column('Lat', width=90, anchor='center')
    self.tree.heading('Lat', text='Lat')
    self.tree.column('Lon', width=90, anchor='center')
    self.tree.heading('Lon', text='Lon')
    self.tree.column('Alt', width=90, anchor='center')
    self.tree.heading('Alt', text='Alt')
    self.tree.column('Spd', width=90, anchor='center')
    self.tree.heading('Spd', text='Spd')
    self.tree.column('hdop', width=90, anchor='center')
    self.tree.heading('hdop', text='hdop')
    self.tree.column('vdop', width=90, anchor='center')
    self.tree.heading('vdop', text='vdop')
    self.tree.column('pdop', width=90, anchor='center')
    self.tree.heading('pdop', text='pdop')
    self.tree.column('Sats Used', width=90, anchor='center')
    self.tree.heading('Sats Used', text='Sats Used')
    self.tree.column('FixMode', width=90, anchor='center')
    self.tree.heading('FixMode', text='FixMode')

    for i in range(5):

        self.tree.insert('', -1, values=(
                                           i+1,
                                           i+2, 
                                           i+3, 
                                           i+4,
                                           i+5,
                                           i+6,
                                           i+7,
                                           i+8,
                                           i+9,
                                           i+10,
                                           i+11))

我在文档和stackoverflow上搜索了,但没有找到相关内容。有人可以帮我吗?

你尝试过使用 tkinter.ttk.Treeview.get_children 吗? - Alex Z
是的,我知道这个方法,但我不知道最终如何处理结果。 - katze
3个回答

10

好的,我终于找到了如何做到这一点,例如显示所有值:

for line in self.tree.get_children():

    for value in self.tree.item(line)['values']:
        print(value)

1

我猜您想访问树的值而不是文本。稍后我会解释它们之间的区别。

如果您有父子层次结构,则使用此代码:

for parent in self.tree.get_children():
    print(self.tree.item(parent)["values"])
    for child in self.tree.get_children(parent):
        print(self.tree.item(child)["values"])

如果您有一个简单的层次结构,可以使用以下代码:
for parent in self.tree.get_children():
    print(self.tree.item(parent)["values"])

现在,你已经掌握了逻辑,可以在父子子项层次结构中自由操作。

除此之外,你可能希望通过循环来填充树形结构,而不是重复相同的代码:

self.tree['columns'] = ('Pool ID','Time', 'Lat', 'Lon', 'Alt', 'Spd', 'hdop','vdop','pdop', 'Sats Used', 'FixMode')
for column in self.tree['columns']:
    # define the column names and headings
    self.tree.column(column, width=90, anchor='center')
    self.tree.heading(column, text=column)

接下来,你可能想把数据插入到树中。你也可以通过循环来完成这个操作,这样会更加简洁:

# let's replicate your example data set
data = [[i+k+1  for k in range(11)] for i in range(5)]
for r, row in data:
    self.tree.insert(parent='', index='end', iid=f"{str(r)}", text='', values=row)

解释: 现在你可以使用print(self.tree.item(parent)["values"])获取值,如果你使用"text"而不是"values",你将得到在self.tree.insert方法中定义的text字段中的任何内容。 iid定义了树中条目的唯一ID:这是通过编程插入的。您最终可以填写text字段并稍后获取内容。 在这个简单的例子中,我留空了parent字段。但如果你有一个父子层次结构,你应该给它命名。
例如:
for p, parent_record in enumerate(data):
    self.tree.insert(parent='', ...)  # can leave this blank
    for r, row in enumerate(parent_record['rows']):
        self.tree.insert(parent=f"{str(p)}", ...)  # any reference to parent loop

0
请使用以下代码:
for Parent in self.treeview.get_children():

    print(self.treeview.item(Parent)["text"])

    for child in self.treeview.get_children(Parent):
        data = self.treeview.item(child)["text"]
        print(data)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接