序文
ttk.Treeview は、階層データの表示に使用できるツリー リストを提供する Tkinter モジュールのコンポーネントです。次のような特徴と機能があります。
- 表示階層: ttk.Treeview は、ツリー構造でのデータの表示をサポートします。各ノードは子ノードを持つことができるため、階層構造を形成できます。ユーザーはノードを展開または折りたたんで、子ノードを表示または非表示にすることができます。
- リスト ビュー: ttk.Treeview は、テーブルと同様に、リスト形式でのデータの表示もサポートします。各列は異なるフィールドを定義し、対応するデータを表示できます。
- 複数の列のサポート: ttk.Treeview の初期化時に columns パラメーターを指定することで、複数の列を作成できます。各列は独自のヘッダーと幅を持つことができます。
- データ バインディング: ttk.Treeview をデータ ソースにバインドできるため、データの挿入、削除、編集がより便利になります。insert メソッドを使用して ttk.Treeview にデータを挿入し、delete メソッドを使用してデータを削除し、set メソッドを使用してデータを更新できます。
- スタイルのカスタマイズ: スタイル、フォント、色などを設定することで、ttk.Treeview の外観をカスタマイズできます。さまざまな行やセルにスタイルやラベルを設定して、カスタマイズされた効果を実現することもできます。
- イベント処理: クリック、ダブルクリック、選択の変更など、さまざまなイベント ハンドラーを 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", "深圳"))
説明する:
- スタイルを作成する: まず、 ttk.Style() オブジェクトを作成し、configure メソッドを使用してリストの行の高さとヘッダーのフォント スタイルを設定します。
- ツリービュー コントロールの作成: ttk.Treeview コンストラクターを呼び出して、self.tree という名前のツリービュー コントロールを作成し、親ウィンドウ self.root のグリッド レイアウトの最初の行/列に配置し、10 行/列にまたがり、60 行を残します。左右の余白をピクセル単位で指定します。
- 列名の定義: self.tree["columns"] プロパティを設定すると、列名が「Name」、「Age」、「City」の 3 つの列を含むリストが定義されます。
- 列の見出し名を設定する: self.tree.Heading メソッドを呼び出すことで、各列の見出し名が設定されます。このうち、「#0」はデフォルトのインデックス列、タイトル文字列は「シリアル番号」、配置は左寄せ、「名前」列のタイトルは「名前」、配置指定なし、デフォルトは中央揃え、「Age」列 タイトルは「Age」、揃えは指定されておらず、デフォルトは中央揃え、「City」列のタイトルは「City」、揃えは指定されていない、デフォルトは中央揃え中央揃えです。
- 列幅の設定: self.tree.column メソッドを呼び出すことにより、各列の幅が設定されます。「#0」列の幅は 50 ピクセル、「名前」列の幅は 100 ピクセル、「年齢」列の幅は 90 ピクセル、「都市」列の幅は 150 ピクセルです。データ列では、デフォルトで左揃えになる「#0」列を除き、他の列のデータはデフォルトで中央揃えになります。
- デフォルト データの挿入: 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", "深圳"))
継続的に更新中...