با سلام بهنام صباغی هستم با اموزش gui با کتابخانه tkinter این قسمت treeview
خب دوستان تری ویو برای نمایش اطلاعات به صورت درختی بکار میاد وقتی این قسمت از اموزش رو تکمیل کنید میفهمید که این ابزار به چه دردی میخوره و بعدها توی برنامه هایی که میسازیم ازش استفاده خواهیم کرد نحوه ی ساخت
MyTV= ttk.Treeview(root)#MyTV = MyTreeView
خب با ساختن و اضافه کردن این ابزار میبینید که فقط یه فضای جعبه مانند خالی برامون نمایش داده میشه و ما برای اضافه کردن ایتم بهش از تابع insert استفاده میکنیم مثلا من توی قطعه کد زیر یه ایتم به اسم firstitem ایجاد میکنم حواستون باشه که برای دسترسی به هر ایتم با منیاز به یک ایدی داریم خب بذارید اول کد رو بنویسم بعد توضیح میدم که متوجه بشید

from tkinter import *
from tkinter import ttk

root=Tk()

tv=ttk.Treeview(root)
tv.pack()
tv.insert('','0','item1',text="First Item")

خب دوستان چیزی که اینجا نیاز به توضیح داره تابع insert هست که اولین ورودیش که میگیره ایدی ایتم والدش هیت مثل ابزار های tkinter که root رو به عنواد والد بهشون میدیم اینجا هم باید ایدی ایتم والد رو بهشون بدیم و اینجا من یک استرینگ خالی دادم به این معنا که این ایتم یک ایتم root یا همون ریشه هست به زبان سادش یعنی ایتم اصلیه والد نداره و ورودی بعدی هم باید یک عدد اینت درون یک استرینگ باشه این عدد موقعیت ایتم رو مشخص میکنه که من اینجا چون اولین ایتمم بود بهش دادم 0 خب ورودی بعدی یک ایدی برای دسترسی های بعدی و استفاده ی ما از ایتم هست که من بهش item1 دادم شما میتونید هر چیزی که دلتون میخواد بدید فقط حواستون باشه که برای استفاده های بعدی باید یادتون بمونه پس بهتره از یه چیز همیشه استفاده کنید خب بعد از ایدی خصوصیت text رو برابر یه استرینگ قرار دادم درواقع این اسمیه که به کاربر نشون داده میشه حواستون باشه اینو با ایدی اشتباه نگیرید ایدی برای برنامه نویسه که ازش استفاده کنه ولی تکست برای کاربر نمایش داده میشه خب حالا برنامه رو اجرا کنید میبینید یه صفحه ی باکس (جعبه ) مانند توش هست که یک ایتم داره توش به اسم First Item که میتونیم انتخابش کنیم خب بریم سراغ بقیه اموزش
خب دوستان میدونید که میشه به ایتم هامون عکس هم اضافه کنیم طریقه ی اوردن عکس روهم توی tkinter قبلا توضیح دادم پس دیگه توضیح نمیدم همه چز دقیقا مثل قبله فقط خصوصیت image رو برابر عکسمون قرار میدیم خب کد زیر رو اجرا کنید حواستون باشه باید یه عکس کنار برنامتون باشه تا بتونید ازش استفاده کنید و بجای python.png باید اسم عکس خودتون رو وارد کنید (یا ادرس یه عکس که توی سیستمون هست رو وارد کنید )
#**************************CODE********************************************************
from tkinter import *
from tkinter import ttk

root=Tk()

tv=ttk.Treeview(root)
tv.pack(fill=BOTH)
tv.insert('','0','item1',text="First Item")
tv.insert('','1','item2',text="second Item")
tv.insert('','end','item3',text="Third Item")

logo=PhotoImage(file="python.png").subsample(90,50)
tv.insert('item2','end','python',text="python",image=logo)


#***************************************************************************************
خب دوستان اینجا چندتا چیز نیاز به توضیح داره اول این که یادم نیست تایع subsample رو قبلا توضیح دادم یا نه پس توضیحش میدم اگر قبلا توضیح دادم یاداوری بشه اگر نه که یاد بگیرید ببینید این تابع برای عکس استفاده میشه وباعث میشه عکسمون به اندازهی ورودی اولش بار از جهت x کوچیکتر بشه و به اندازه ورودی دومش بار از جهت y  شما میتونید خودتون با تصویرتون تست کنید که چقدر از هرجهت براش کافیه که کوچیکش کنید چون قراره اینجا یه حالت ایکون مانند داشته باشیم و عکس من اندازه ش
1920x1080
بود من مجبور شدم خیلی کوچیکش کنم تا اندازه ی ایکون بشه و مورد دیگه اینه که توی اخری که اضافه کردم همون که عکس داره والدش رو ایتم دومم گذاشتم که وقتی اجراش میکنید یه علات کنار ایتم دومتون هست که اگر روش کلیک کنید باز میشه و یه حالت درخت مانند داره (منظورم درخت واقعی نیست  درخت کامپیوتری و برنامه نویسی رو میگم که منظورمون شاخه شاخه شدنه ) اگر درست تنظیمش کنید (انداره عکس رو ) وقتی بازش میکنید یه عکس کوچیک کنار نوشته ی python هست و دوجا برای موقعیت یا ایندکسمون از کلمه ی end بجای عدد استفاده کردم که این به معنی اخریم موقعیتمون هست و اگر ایتم دیگه ای اضافه کنیم میاد قبل این ایتم چوناین باید اخری باشه  خب اینم از نشون دادن درختی اطلاعات بریم سراغ ادامه اموزش خب میتونید تنظیم کنید چندتا ایتم رو بتونه از بالا به پایین نشون بده بعنی یه جورایی تعدادی که توی ارتفاعش جا میگیره خب با کانفیگ خصوصیت height رو برابر تعداد ایتم هایی که میخوایم جا بگیره قرار میدیم مثل زیر
tv.config(height= 5)
خب شاید لازم داشته باشیم که یه ایتم رو جابجا کنیم برای این کار از تابع move استفاده میکنم به صورت زیر
tv.move('item2','item1','end')
اولین ورودی ایدی ایتممون هست که میخوایم جابجاش کنیم دومیش هم والد جدیدشه یعنی ایتمی که میخوایم این ایتممون بره زیر مجموعش بشه و اخرین ورودی هم ایندکس(یا همون موقعیتیه ) که میخوایم این ایتم بره اونجا  ما میتونیم یک ایتم رو باز کنیم ببینید چطوریه
tv.item('item1',open=True)
دقت کنید از کانفیگ استفاده نکردم از ایتم استفاده کردم چون این قابلیت برای ایتم هست نه برای خود ابزار
برای غیر قابل مشاهده کردن یک ایتم ز تابع detach  استفاده میکنیم
tv.detach('item3')
برای ضافه کردن دوباره ی یک ایتم مخفی شده از تابع move استفاده میکنیم مثل قبل اولین ورودی ایدی دومین والد سومین هم ایندکسشه
و اما برای پاک کردن یک ایتم به صورت کامل که دیگه وجود نداشته باشه از تابع همیشگی delete استفاده میکنیم
tv.delete('item3')
خب وارد یحث پیشرفته ی treeview میشیم اولین مبحث اضافه کردن column هست یعنی ستون برای نمایش بهتر اطلاعات برای ساخت یک ستون از پراپرتی columns که متعلق به treeview هست استفاده میکنیم دقت کنید این پراپرتی(خصوصیت ) متعلق به خود ابزار هست پس از config استفاده میکنیم
tv.config(columns= ('version'))
خب حالا ستون رو درست کردیم برای تنظیمش از column استفاده میکنیم ببینید
tv.column('version',width=50,anchor='center')
دقت کنید anchor در مورد تکست هست که میگه وسط راست یا چپ چین باشه خب حالا اگر بخوایم عنوان ستون هامون رو تنظیم کنیم از تابع heading استفاده میکنیم به صورت زیر
tv.heading('version',text='Version')
دوباره دقت اولی ایدی ستونمون هست دومی عنوانی که به کاربر نشون داده میشه و تا یادم نرفته اینم بگم که شاید شما بخواید این کارها روبا ستون اصلی انجام بدید خب برای ایدی ستون اصلی از پایوند ساین و صفر استفاده میکنیم اگر نمیدونید پاوند ساین چیه نترسید همون علامت مربع هست که توی شماره های ussd استفاده میکنیم استفاده میکنیم فکر کنم با این توضیح عالیم مشکل دوتا شد الان باید ussd رو هم توضیح بدم اقا بیخیال همین که مینویسم رو ببینید متوجه میشید
tv.config('#0',width= 150)
حالا فهمیدید چی میگم ؟
خب خدا رو شکر حالا ما ستون رو ساختیم ولی این که چطور ازش استفاده میکنیم رو هم بگم
ببینید ساختار یه ساختار شیگرای وراثتیه (عمرا بفهمید چی میگم خودمم به زور فهمیدم ) بذارید یه توضیح بدم تا براتون جابیوفته و دیگه توی بقیه جاها توضیح ندم ببینید ما میخویم یک ایتم از treeview رو تنظیم کنیم پس از تابع set که متعلق به treeview ست استفاده میکنیم و نام ایتمی که میخوایم به ستونش مقدار بدیم رو به عنوان اولین ورودی میدیم و بعد ایدی ستونی رو که میخوایم بهش مقدار بدیم چون ممکنه چند تا ستون داشته باشیم و بعد مقدار رو بهش میدیم به همین راحتی حالا کد کل اینهایی که فتم رو ببینید
#********************************CODE********************************************
from tkinter import *
from tkinter import ttk

root=Tk()

tv=ttk.Treeview(root)
tv.pack(fill=BOTH)
tv.insert('','0','item1',text="First Item")
tv.insert('','1','item2',text="second Item")
tv.insert('','end','item3',text="Third Item")

logo=PhotoImage(file="python.png").subsample(90,50)
tv.insert('item2','end','python',text="python",image=logo)
tv.config(height= 5)
tv.move('item2','item1','end')
tv.item('item1',open=True)
tv.item('item2',open=True)
tv.config(columns= ('version'))
tv.column('version',width=60,anchor='center')
tv.heading('version',text='Version')
tv.set('python','version','3.4')
#*******************************************************************************
خب میتونید برای ایتم ها یک تگ بذاریم و یا با تگها دسته بندیشون کنیم تا بتونیم بهشون خصوصیات بدیم خب تگ رو اینطوری ایجاد میکنیم
tv.item('python',tags=('software'))
نحوه ی استفاده هم اینطوریه
tv.tag_configure('software',background='yellow')
خب حالا میخوایم وقتی کاربر یه گزینه رو انتخاب میکنه یه اتفاقی بیوفته مثلا تابعی داشته باشیم که اجرا بشه اینجا از bind استفاده میکنیم
اول تابع تعریف میکنیم بعد bind تعریف میکنیم براش
#*********************CODE********************************************
def callback(event):
    print(tv.selection())

tv.bind('<<TreeviewSelect>>', callback)
#*******************************************************************************************************
در حالت عادی کاربر میتونه با نگه داشتن دکمه نترل چندتا ایتم رو مشخص کنه اگر بخوایم نتونه همچین کاری بکنه باید بنویسیم
tv.config(selectmode='browse')
خب یه selectmode دیگه داریم به اسم none این میگه اصلا کاربر نتونه انتخاب کنه و برای انتخاب داخل کد هم میتونیم از تابع selection_add استفاده کنیم
tv.selection_add('python')
برای برداشتن انتخاب هم از تابع selections_remove استفاده میکنیم
tv.selection_remove('python')
و اخرین تابع رو هم تست کنید خودتون کاربرد رو پیدا کنید
tv.selection_toggle('python')
خدا نگهدار