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 を構成して使用し、カスタマイズされたツリー リスト機能を実現できます。

1.方法

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. ツリービュー コントロールの作成: ttk.Treeview コンストラクターを呼び出して、self.tree という名前のツリービュー コントロールを作成し、親ウィンドウ self.root のグリッド レイアウトの最初の行/列に配置し、10 行/列にまたがり、60 行を残します。左右の余白をピクセル単位で指定します。
  3. 列名の定義: self.tree["columns"] プロパティを設定すると、列名が「Name」、「Age」、「City」の 3 つの列を含むリストが定義されます。
  4. 列の見出し名を設定する: self.tree.Heading メソッドを呼び出すことで、各列の見出し名が設定されます。このうち、「#0」はデフォルトのインデックス列、タイトル文字列は「シリアル番号」、配置は左寄せ、「名前」列のタイトルは「名前」、配置指定なし、デフォルトは中央揃え、「Age」列 タイトルは「Age」、揃えは指定されておらず、デフォルトは中央揃え、「City」列のタイトルは「City」、揃えは指定されていない、デフォルトは中央揃え中央揃えです。
  5. 列幅の設定: self.tree.column メソッドを呼び出すことにより、各列の幅が設定されます。「#0」列の幅は 50 ピクセル、「名前」列の幅は 100 ピクセル、「年齢」列の幅は 90 ピクセル、「都市」列の幅は 150 ピクセルです。データ列では、デフォルトで左揃えになる「#0」列を除き、他の列のデータはデフォルトで中央揃えになります。
  6. デフォルト データの挿入: self.tree.insert メソッドを呼び出すことによって、データ行がツリービューに挿入されます。ここに、名前、年齢、都市情報を含むインデックス「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
おすすめ