Tkinter创建列表使用方法

前言

  ttk.Treeview 是 Tkinter 模块中的一个组件,它提供了一个可用于显示层次结构数据的树状列表。它具有以下特点和功能:

  1. 显示层次结构:ttk.Treeview支持以树状结构显示数据。每个节点可以有子节点,从而形成层次结构。用户可以展开或折叠节点来查看或隐藏子节点。
  2. 列表视图:ttk.Treeview 还支持以列表形式显示数据,类似于表格。每列可以定义不同的字段,并显示相应的数据。
  3. 多列支持:你可以通过在 ttk.Treeview 初始化时指定 columns 参数来创建多个列。每列可以有自己的标题和宽度。
  4. 数据绑定:ttk.Treeview 可以与数据源绑定,使数据的插入、删除和编辑更加方便。你可以使用 insert 方法向ttk.Treeview 中插入数据,使用 delete 方法删除数据,使用 set 方法更新数据。
  5. 样式定制:你可以通过设置样式、字体、颜色等来定制 ttk.Treeview的外观。也可以为不同的行、单元格设置样式或标签,以实现自定义效果。
  6. 事件处理:你可以为 ttk.Treeview组件绑定各种事件处理程序,例如单击、双击、选择变化等。通过处理这些事件,你可以响应用户的操作,并执行相关的逻辑。

ttk.Treeview 是 Tkinter 中非常强大和灵活的组件,可用于创建各种复杂的层次结构列表和数据展示界面。你可以根据自己的需求来配置和使用 ttk.Treeview,以实现定制的树状列表功能。

一、方法

import tkinter as tk
from tkinter import ttk


class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('演示窗口')
        self.root.geometry("600x380+1100+150")
        self.interface()

    def interface(self):
        """"界面编写位置"""
        pass


if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()

1、创建列表和数据并设置样式

    def interface(self):
        """"界面编写位置"""
        # (1)创建样式
        style = ttk.Style()
        style.configure("Treeview", rowheight=20)  # 设置行高
        style.configure("Treeview.Heading", font=('Arial', 11, 'bold'))  # 设置表头字体

        # (2)创建 Treeview 控件,设置高度为10行
        self.tree = ttk.Treeview(self.root, height=10, style="Treeview")
        self.tree.grid(row=0, column=0, rowspan=10, columnspan=10, padx=60)

        # (3)定义列名
        self.tree["columns"] = ("Name", "Age", "City")

        # (4)设置列的标题名称,anchor可设置对其方式:居中(center)/左对齐(w)/右对齐(e),无anchor参数时,标题名称默认居中
        self.tree.heading("#0", text="序号", anchor="w")
        self.tree.heading("Name", text="姓名")
        self.tree.heading("Age", text="年龄")
        self.tree.heading("City", text="城市")

        # (5)设置列宽度(像素),无anchor参数时,列表中的数据除(#0)外其余都是默认左对齐
        self.tree.column("#0", width=50)
        self.tree.column("Name", width=100, anchor="center")
        self.tree.column("Age", width=90, anchor="center")
        self.tree.column("City", width=150, anchor="center")

        # (6)插入默认数据
        self.tree.insert("", tk.END, text="1", values=("张三", "25", "深圳"))

在这里插入图片描述

解释:

  1. 创建样式:首先创建了一个ttk.Style()对象,并通过configure方法设置了列表的行高和表头字体样式。
  2. 创建 Treeview 控件:调用 ttk.Treeview 构造函数创建了一个名为 self.tree 的 Treeview控件,并将其放置在父窗口 self.root 的网格布局中,位置为第一行/列,跨越10个行/列,左右留有60像素的边距。
  3. 定义列名:通过设置 self.tree[“columns”] 属性,定义了一个包含三个列的列表,列名分别为 “Name”、“Age” 和"City"。
  4. 设置列的标题名称:通过调用 self.tree.heading 方法,设置了每个列的标题名称。其中,“#0” 是默认的索引列,标题文本为"序号",对齐方式为左对齐;“Name” 列的标题为 “姓名”,没有指定对齐方式,默认居中对齐;“Age” 列的标题为 “年龄”,没有指定对齐方式,默认居中对齐;“City” 列的标题为 “城市”,没有指定对齐方式,默认居中对齐。
  5. 设置列宽度:通过调用 self.tree.column 方法,设置了每个列的宽度。“#0” 列宽度为 50 像素,“Name” 列宽度为100 像素,“Age” 列宽度为 90 像素,“City” 列宽度为 150 像素。在数据列中,除了 "#0"列是默认左对齐外,其他列的数据默认居中对齐。
  6. 插入默认数据:通过调用 self.tree.insert 方法,在 Treeview 中插入了一条数据行。这里插入了一个索引为 "1"的数据行,该行包含了姓名、年龄和城市信息。

2、获取列表数据

    def interface(self):
        """"界面编写位置"""
        # (1)创建样式......
        # (2)创建 Treeview 控件......
        # (3)定义列名......
        # (4)设置列的标题名称......
        # (5)设置列宽度(像素)......
        # (6)插入默认数据
        self.tree.insert("", tk.END, text="1", values=("张三", "25", "深圳"))
        self.tree.insert("", tk.END, text="2", values=("王五", "30", "上海"))

        # 创建按钮
        self.Button0 = tk.Button(self.root, text="获取数据", command=self.get_data)
        self.Button0.grid(row=11, column=0, ipadx=10)

        self.Button1 = tk.Button(self.root, text="获取全部数据", command=self.get_whole_data)
        self.Button1.grid(row=11, column=2, ipadx=10)
        # 添加文本框
        self.Label0 = tk.Label(self.root, text="打印日志:")
        self.Label0.grid(row=12, column=0, padx=60)
        self.w1 = tk.Text(self.root, width=50, height=5)
        self.w1.grid(row=13, column=0, columnspan=5, padx=60)

    def get_data(self):
        '''获取选中数据'''
        selected_items = self.tree.selection()
        if selected_items:
            for item in selected_items:
                row_data = self.tree.item(item)['values']
                self.w1.insert("1.0", f"Selected Row Data:{
      
      row_data}\n")
        else:
            self.w1.insert("1.0", "未选中数据\n")

    def get_whole_data(self):
        '''获取全部数据'''
        rows = self.tree.get_children()  # 获取所有的行ID
        # 遍历每一行
        for row in rows:
            # 获取该行的数据字典
            data = self.tree.item(row)
            self.w1.insert("1.0", f"{
      
      data['values']}\n")

在这里插入图片描述

3、添加、编辑、删除

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox


class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('演示窗口')
        self.root.geometry("600x380+1100+150")
        self.interface()

    def interface(self):
        """"界面编写位置"""
        # (1)创建 Treeview 控件, 设置高度为10行
        self.tree = ttk.Treeview(self.root, height=10)
        self.tree.grid(rowspan=10, columnspan=10, padx=30)
        # (2)定义列名
        self.tree["columns"] = ("Name", "Age", "City")
        # (3)设置列的标题名称
        self.tree.heading("#0", text="序号", anchor="w")
        self.tree.heading("Name", text="姓名")
        self.tree.heading("Age", text="年龄")
        self.tree.heading("City", text="城市")
        # (4)设置列宽度(像素)
        self.tree.column("#0", width=50)
        self.tree.column("Name", width=100, anchor="center")
        self.tree.column("Age", width=90, anchor="center")
        self.tree.column("City", width=150, anchor="center")
        # (5)插入默认数据
        self.tree.insert("", tk.END, text="1", values=("张三", "25", "深圳"))
        # 创建按钮
        self.Button0 = tk.Button(self.root, text="添加", command=self.add_page)
        self.Button0.grid(row=11, column=1, ipadx=10)
        self.Button1 = tk.Button(self.root, text="编辑", command=self.edit_page)
        self.Button1.grid(row=11, column=3, ipadx=10)
        self.Button2 = tk.Button(self.root, text="删除", command=self.delete_item)
        self.Button2.grid(row=11, column=5, ipadx=10)

    def add_page(self):
        self.Label0 = tk.Label(self.root, text="姓名")
        self.Label0.grid(row=0, column=11)

        self.entry00 = tk.StringVar()
        self.entry0 = tk.Entry(self.root, textvariable=self.entry00, width=15)
        self.entry0.grid(row=1, column=11)

        self.Label1 = tk.Label(self.root, text="年龄")
        self.Label1.grid(row=2, column=11)

        self.entry01 = tk.StringVar()
        self.entry1 = tk.Entry(self.root, textvariable=self.entry01, width=15)
        self.entry1.grid(row=3, column=11)

        self.Label02 = tk.Label(self.root, text="城市")
        self.Label02.grid(row=4, column=11)

        self.entry02 = tk.StringVar()
        self.entry2 = tk.Entry(self.root, textvariable=self.entry02, width=15)
        self.entry2.grid(row=5, column=11)

        self.Button_1 = tk.Button(self.root, text="确定", command=self.add_item)
        self.Button_1.grid(row=6, column=11, ipadx=10)

    def add_item(self):
        '''添加数据'''
        rows = self.tree.get_children()  # 获取所有的行ID
        name = self.entry00.get()
        age = self.entry01.get()
        city = self.entry02.get()
        if name and age and city:
            self.tree.insert("", tk.END, text=len(rows)+1, values=(name, age, city))
        else:
            self.Button_1.bind("<Button-1>", self.window("输入框不可以为空"))

    def edit_page(self):
        selected_items = self.tree.selection()
        if selected_items:
            for item in selected_items:
                row_data = self.tree.item(item)['values']

                self.Label0 = tk.Label(self.root, text="姓名")
                self.Label0.grid(row=0, column=11)

                self.entry00 = tk.StringVar()
                self.entry00.set(row_data[0])
                self.entry0 = tk.Entry(self.root, textvariable=self.entry00, width=15)
                self.entry0.grid(row=1, column=11)

                self.Label1 = tk.Label(self.root, text="年龄")
                self.Label1.grid(row=2, column=11)

                self.entry01 = tk.StringVar()
                self.entry01.set(row_data[1])
                self.entry1 = tk.Entry(self.root, textvariable=self.entry01, width=15)
                self.entry1.grid(row=3, column=11)

                self.Label02 = tk.Label(self.root, text="城市")
                self.Label02.grid(row=4, column=11)

                self.entry02 = tk.StringVar()
                self.entry02.set(row_data[2])
                self.entry2 = tk.Entry(self.root, textvariable=self.entry02, width=15)
                self.entry2.grid(row=5, column=11)

                self.Button_1 = tk.Button(self.root, text="确定", command=self.edit_item)
                self.Button_1.grid(row=6, column=11, ipadx=10)
        else:
            self.Button1.bind("<Button-1>", self.window("未选中数据"))

    def edit_item(self):
        '''编辑数据'''
        selected_item = self.tree.selection()
        name = self.entry00.get()
        age = self.entry01.get()
        city = self.entry02.get()
        if name and age and city:
            self.tree.item(selected_item, values=(name, age, city))
        else:
            self.Button_1.bind("<Button-1>", self.window("输入框不可以为空"))

    def delete_item(self):
        '''删除数据'''
        selected_item = self.tree.selection()
        if selected_item:
            self.tree.delete(selected_item)
        else:
            self.Button2.bind("<Button-1>", self.window("未选中数据"))

    def window(e, text):
        '''创建弹窗'''
        messagebox.showinfo("提示", text)


if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()

在这里插入图片描述

4、隐藏默认的索引列

    def interface(self):
        """"界面编写位置"""
        # 创建 Treeview 控件;设置高度为10行;只显示列名行,隐藏索引列
        self.tree = ttk.Treeview(self.root, height=10, show="headings")
        self.tree.grid(row=0, column=0, rowspan=10, columnspan=10, padx=60)
        # 定义列名
        self.tree["columns"] = ("Name", "Age", "City")
        # 设置列的标题名称
        self.tree.heading("Name", text="姓名")
        self.tree.heading("Age", text="年龄")
        self.tree.heading("City", text="城市")
        # 设置列宽度(像素)
        self.tree.column("Name", width=100, anchor="center")
        self.tree.column("Age", width=90, anchor="center")
        self.tree.column("City", width=150, anchor="center")
        # 插入默认数据
        self.tree.insert("", tk.END, values=("张三", "25", "深圳"))

在这里插入图片描述

持续更新中…

猜你喜欢

转载自blog.csdn.net/qq_45664055/article/details/131355928
今日推荐