tkinter加sqlite3 多层文件夹分组怎么设计

#运维一枚,想着用tkinter加sqlite3写一个服务器管理系统 用户可以自己创建多层文件夹分组,不限制层数

#遇到的问题:求帮忙看看,数据库设计了两个表,一个GroupTab表,用来存储用户创建的文件夹分组节点,另一个server表,用来存储服务器的远程信息和关联文件夹分组的字段,有两个问题死活想不明白,一个就是用户创建了文件夹,这个文件夹的节点id该怎么往数据库里记,界面上展示文件夹列表时不至于乱了,比如a和b两个根目录文件夹,a下面有个a1,b下面有个b1,节点id该怎么设计呢,因为展示到tkinter界面上应该是用for循环插入到treeview表内

            # 创建数据库的代码块
            self.cursor.execute('''
                    CREATE TABLE IF NOT EXISTS servers (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        conn_type TEXT,
                        name TEXT,
                        host TEXT,
                        port INTEGER,
                        username TEXT,
                        password TEXT,
                        status TEXT,
                        ParentId INT
                    )
            ''')
            self.cursor.execute('''
                    CREATE TABLE GroupTab (
                        id       INTEGER   PRIMARY KEY AUTOINCREMENT,
                        Name     CHAR (64) NOT NULL,
                        ParentId INT       NOT NULL
                    )
            ''')
    # 添加文件夹分组的代码块
   # 添加文件夹分组
def add_folder(self):
    # 查询分组列表
    conn = sqlite3.connect('rdp_db.db')
    c = conn.cursor()
    c.execute("SELECT * FROM GroupTab")
    groups = c.fetchall()
    ls1 = []
    for group in groups:
        ls1.append(group[1])
    # 创建窗口
    top = tk.Toplevel()
    top.title("添加分组")
    top.geometry('300x150+200+200')
    # 设置窗口宽高固定
    top.resizable(0, 0)
    lab1 = tk.Label(top,text="添加到分组:")
    lab1.pack()
    down_menu = tk.StringVar()
    down = ttk.Combobox(top, width=10, textvariable=down_menu)  # #创建下拉菜单
    # 车站下拉列表取值
    down["value"] = ls1[0]
    down.current(0)
    down.pack()
    lab2 = tk.Label(top, text="分组名称:")
    lab2.pack()
    name_entry = tk.Entry(top)
    name_entry.pack()
    qt_btn = tk.Button(top,text="确定",command=lambda :self.add_new_node(name_entry.get()))
    qt_btn.pack()
    if groups == '':
        # 将根节点名称添加到groupId表中
        self.c.execute("INSERT INTO groupId (name, parent_id) VALUES (?, ?)", (name_entry.get(), 0))
        self.conn.commit()
    conn.close()
def add_new_node(self,name):
    # 在当前选中节点下创建新节点
    selected_item = self.group_tree.focus()
    self.group_tree.insert(selected_item,"end",text=name)


  1. 对于文件夹的节点id,可以使用层级编码,这样就可以很好区分不同级别的文件夹,将不同级别的文件夹分别以不同的编码标识出来。比如可以将a为1,a1为1.1,以此类推,就可以将文件夹的层级做到标识出来。最后将这些层级编码保存在GroupTab表的字段中即可。

  2. 对于server表的设计,可以使用group_id将关联的文件夹分组id存储在server表中,以此来标记某个服务器属于哪个文件夹分组,group_id可以使用GroupTab表中group_id字段保存,这样就可以使用group_id来确定某个服务器属于哪个文件夹分组,从而实现文件夹分组和服务器管理的组合使用。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^