功能介绍
- 随机生成单词,并生成树控件
- 包含 tkinter 界面 和 wxpython 界面
请看 tkinter 图形界面
请看 wxpython 图形界面
设计步骤
- def my_lorem 可生成指定数量的随机单词
- class GenerateData 生成特定结构的多行数据,每行的结构为 (id, text, parent_id)。其中 parent_id 中包含了 id, 即该数据为多层级数据。可在该类中指定层级数。
- class TkTree 以上面生成的数据为基础,,递归生成 tkinter Treeview 的树
- class WxFrame 以上面生成的数据为基础,递归生成 wx.TreeCtrl 的树
from random import randint
import tkinter as tk
from tkinter import ttk
import wx
def my_lorem(n=1):
"""生成无意义的字母组合"""
"""10万个单词耗时约0.62秒"""
string = 'abcdefghijklmnopqrstuvwxyz'
words = set() # 利用集合的功能来去重
while len(words) < n:
word = ''
for t in range(randint(3, 10)): # 每个单词的长度为3~10
letter = string[randint(0, 25)]
word += letter
words.add(word.title())
return list(words)
class GenerateData:
def __init__(self, number=100):
self.num = number # 行数
self.levels = 10 # 层级为10
self.sub_num = randint(0, 10) # 子项数目为0~10
self.data_list = [] # 生成的数据列表
self.words = my_lorem(self.num) # 原数据源
# 生成第1级数据
while self.num > 0:
self.num -= 1
row = (self.num, self.words[self.num], -1)
self.data_list.append(row)
self.levels = 10
self.make_tree(row)
def make_tree(self, parent):
self.levels -= 1
if self.levels > 0 and randint(0, 1):
sub_num = randint(0, 10) # 子项数目为0~10
for _ in range(sub_num):
self.num -= 1
if self.num > 0:
text = self.words[self.num]
data = (self.num, text, parent[0])
self.data_list.append(data)
self.make_tree(data)
else:
return
class TkTree(tk.Tk):
"""生成一颗树"""
def __init__(self, rows):
super().__init__()
self.title('tkinter 生成树')
self.geometry('400x500+760+180')
rows.sort(key=lambda x: x[1])
self.rows = rows
self.on_init()
def on_init(self):
frame = tk.Frame(self)
frame.pack(anchor='w', expand=True, fill='both')
tree = ttk.Treeview(frame, show='tree')
tree.pack(anchor='w', expand=True, fill='both', side='left')
def get_rows(data, key):
rows = []
for d in data:
if d[2] == key:
rows.append(d)
self.rows.remove(d)
return rows
def insert_items(parent_item=None):
if parent_item:
item_data = tree.item(parent_item)['values']
items = get_rows(self.rows, item_data[0])
else:
parent_item = tree.insert('', 'end', text='MyRoot', open=True) # 自定义根节点
items = get_rows(self.rows, -1)
if items:
for row in items:
this_item = tree.insert(parent_item, 'end', text=row[1], values=row)
insert_items(this_item)
else:
return
insert_items()
# 设定滚动条
vs = ttk.Scrollbar(frame, command=tree.yview)
vs.pack(side='right', fill='y')
tree.config(yscrollcommand=vs.set)
class WxFrame(wx.Frame):
def __init__(self, rows):
super().__init__(None, -1, 'wxpython 生成树测试', size=(-1, 500))
rows.sort(key=lambda x: x[1])
self.rows = rows
self.on_init()
self.Center()
self.Show()
def on_init(self):
tree = wx.TreeCtrl(self)
root = tree.AddRoot('MyTree', data=(-1,))
def get_rows(data, key):
rows = []
for d in data:
if d[2] == key:
rows.append(d)
self.rows.remove(d)
return rows
def make_tree(parent):
parent_data = tree.GetItemData(parent)
rows = get_rows(self.rows, parent_data[0])
if rows:
for row in rows:
this_item = tree.AppendItem(parent, row[1], data=row)
make_tree(this_item)
make_tree(root)
tree.Expand(root)
dt = GenerateData(1000).data_list
app = TkTree(dt)
app.mainloop()
# app = wx.App()
# frm = WxFrame(dt)
# app.MainLoop()