当前位置:   article > 正文

Tkinter创建列表使用方法_tkinter 表格

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

在这里插入图片描述

解释:

  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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

在这里插入图片描述

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138

在这里插入图片描述

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", "深圳"))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

5、添加垂直滚动条

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):
        """界面编写位置"""
        # 创建 Treeview 控件
        self.tree_view = ttk.Treeview(self.root, height=10, show="headings")
        self.tree_view.grid(row=0, column=0, sticky='nsew')

        # 添加垂直滚动条控件
        self.scroll_bar = ttk.Scrollbar(self.root, orient=tk.VERTICAL, command=self.tree_view.yview)
        self.scroll_bar.grid(row=0, column=1, sticky='ns')
        # 滚动条与 Treeview 控件进行关联
        self.tree_view.configure(yscrollcommand=self.scroll_bar.set)

        # 定义列名
        self.tree_view["columns"] = ("Name", "Age", "City")
        # 设置列的标题名称
        self.tree_view.heading("Name", text="姓名")
        self.tree_view.heading("Age", text="年龄")
        self.tree_view.heading("City", text="城市")
        # 设置列宽度(像素)
        self.tree_view.column("Name", width=100, anchor="center")
        self.tree_view.column("Age", width=90, anchor="center")
        self.tree_view.column("City", width=150, anchor="center")
        # 插入默认数据
        for i in range(20):
            self.tree_view.insert("", tk.END, values=("李四", "28", "北京"))
            self.tree_view.insert("", tk.END, values=("张三", "25", "深圳"))


if __name__ == "__main__":
    run = GUI()
    run.root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

在这里插入图片描述

持续更新中…

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/464071
推荐阅读
相关标签
  

闽ICP备14008679号