python - 在tkinter的treeview中的for循环中的每个父节点下添加子节点
问题描述
我正在尝试制作一个显示来自 mysql 数据库的数据的树视图。它检索数据,并将其转换为元组列表。我已经创建了一个 for 循环,它可以很好地获取数据并将其放入树视图中。
count = 0
for record in rows: #forloop adding all the information from data list, no matter how many their are in the list
my_tree.insert(parent='', index='end', iid=count, text='', values=(record[0], record[1], record[2], record[3], record[4], record[5]))
count += 1
但是,在每个父节点下,我希望 for 循环也放置一个子节点。当前的树视图看起来像这样
studentid firstname lastname class1 class2 class3
0 5 Ayoung ere 23 29 22
1 6 Emma 4343 24 22 25
2 7 John 343G&$ 28 26 27
3 8 Anthony @^b 26 25 22
4 9 Enshean E(! 23 26 29
5 12 Ian %^&67HN 23 25 26
6 13 Ludwig Beethoven 23 26 29
7 14 Wolfgang Mozart 23 24 26
8 19 Joseph Haydn 23 26 27
9 20 Enshean @&V 23 26 29
10 21 Enshean L^& 23 26 29
在列表中的每个人下面都会有一个子节点,它会显示从数据库中检索到的另一个列表中的 3 条信息。该列表如下所示:
[(22, 'Math', 'Mr. Rosario', 'D2'), (23, 'Music', 'Mr. Young', 'M1'), (24, 'Biology', 'Ms. Marks', 'C4'), (25, 'Chemistry', 'Mr. Musk', 'C2'), (26, 'Physics', 'Mr. Walrath', 'A8'), (27, 'Economics', 'Mr. Sinclair', 'E12'), (28, 'DGT', 'Mr. Turing', 'F3'), (29, 'English', 'Mr. Gibson', 'B5')]
正如我们在我的树视图中看到的那样,在 class1、2 和 3 下有一个数字,对应于来自另一个数据库的 id,如上所示。我在子节点中想要的是在每个类下,将是类的名称。例如:
studentid firstname lastname class1 class2 class3
0 5 Ayoung ere 23 29 22
> Music English Math
1 6 Emma BI$! 24 22 25
> Biology Math Chemistry
这有点难以用语言表达,但希望你能明白。在尝试将具有相应数据的子节点放在 for 循环中的每个父节点下的任何帮助将不胜感激。
解决方案
您可以将您的列表翻成字典:{number:subject}。如果您的列表被调用rows2
,您可以这样做
dic = {values[0]: values[1] for values in rows2}
然后在树中添加子项
tree.insert(count, 'end', values=('',)*3 + tuple(dic[record[i]] for i in range(3,6)))
第一个数据库count
中的项目 iid 和值在哪里。record
完整示例
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
columns = ['studentid', 'firstname', 'lastname', 'class1', 'class2', 'class3']
tree = ttk.Treeview(root, columns=columns)
for col in columns:
tree.heading(col, text=col)
tree.pack()
# first database
rows = [
[5, 'Ayoung', 'ere', 23, 29, 22],
[6, 'Emma', '4343', 24, 22, 25],
[7, 'John', '343G&$', 28, 26, 27],
[8, 'Anthony', '@^b', 26, 25, 22],
[9, 'Enshean', 'E(!', 23, 26, 29],
[12, 'Ian', '%^&67HN', 23, 25, 26],
[13, 'Ludwig', 'Beethoven', 23, 26, 29],
[14, 'Wolfgang', 'Mozart', 23, 24, 26],
[19, 'Joseph', 'Haydn', 23, 26, 27],
[20, 'Enshean', '@&V', 23, 26, 29],
[21, 'Enshean', 'L^&', 23, 26, 29]
]
# second database
rows2 = [
(22, 'Math', 'Mr. Rosario', 'D2'), (23, 'Music', 'Mr. Young', 'M1'),
(24, 'Biology', 'Ms. Marks', 'C4'), (25, 'Chemistry', 'Mr. Musk', 'C2'),
(26, 'Physics', 'Mr. Walrath', 'A8'),
(27, 'Economics', 'Mr. Sinclair', 'E12'), (28, 'DGT', 'Mr. Turing', 'F3'),
(29, 'English', 'Mr. Gibson', 'B5')
]
# dictionary from second database
dic = {values[0]: values[1] for values in rows2}
# put data in treeview
for count, record in enumerate(rows): #forloop adding all the information from data list, no matter how many their are in the list
tree.insert(parent='', index='end', iid=count, text='', values=(record[0], record[1], record[2], record[3], record[4], record[5])) # data from first database
tree.insert(count, 'end', values=('',)*3 + tuple(dic[record[i]] for i in range(3,6))) # subitem using second database
root.mainloop()
推荐阅读
- javascript - airtable:TypeError:无法读取在 JEST 中运行的未定义的属性“绑定”
- python - 将字符串转换为数据框
- ubuntu - 在终端中设置每个目录背景
- python - 在 YAML 中操作环境变量
- css - 如何将文本分隔到 flex-box 中的新行中?
- python - 地球上最小/最简单数据的梯度下降问题
- assembly - 如何在汇编中将 20 位数字存储到 64 位寄存器
- angularjs - Mat-Select 下拉菜单未在 patchvalue 上选择
- node.js - 音频和 DeepSpeech
- flutter - 包错误 google_map_location_picker: 4.0.0