生成树控件

功能介绍

  • 随机生成单词,并生成树控件
  • 包含 tkinter 界面 和 wxpython 界面

请看 tkinter 图形界面

tkinter Treeview

请看 wxpython 图形界面

wxpython TreeCtrl

设计步骤

  • 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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值