با سلام بهنام صباغی هستم با اموزش gui با کتابخانه tkinter این قسمت menu
خب وستان مطمئنم تا حالا حتما توجه کردید که با هر برنامه ای کار میکنید قسمت بالای برنامه یه سری نوشته مثل file هست که وقتی روشون کلیک میکنید یه منو براتون باز میشه که میونید از این منوها گزینه ی مورد نیازتون رو پیدا کنید تا کارتون رو انجام بده حتی اگر یه نوت پد ساده رو هم باز کنید این منو ها رو داره خب بریم سرغ ساخت این منو ها در برنامتون توی پایتون اول باید یک منو بسازید که والدش root باشه چون میخوایم روی روت منو رو سوار کنیم کد زیر رو بینید تا توضیح میدم

#*************************************CODE********************************************
from tkinter import *
from tkinter import ttk

root=Tk()

root.option_add('*tearOff',False)
menubar=Menu(root)
root.config(menu=menubar)

file=Menu(menubar)
edit=Menu(menubar)
help_=Menu(menubar)


menubar.add_cascade(menu=file,label='File')
menubar.add_cascade(menu=edit,label='edit')
menubar.add_cascade(menu=help_,label='help')

#*************************************************************************************
خب دقیق نگاه کنید بعد ساخت منو که والدش رو root گذاشتم خصوصیت menu رو برابر کنویی که ساختیم میذریم و بعد برای نامی که به کاربر نمایش میدیم خصوصیت label رو نتظیم میکنیم و اما در مورد این خط
root.option_add('*tearOff',False)
ببینید اگر این خط کد رو نزنید منوهات یه علامت خطچین دارند بالاشون که که با کلیک روی اون منومون توی یه صفقحه ی جدا نشون داده میشه که اصلا جاب یست شما میتونید برای جلوگیری ازش این خط رو به برنامتون اضافه کنیم برای اضافه کردن یه کامند که به ازای کلیک روی باتنمون این کامند اجرا بشه اینطوری عمل میکنیم
file.add_command(label = 'New',command=lambda :print("new "))
خب اینطوری یه ایتم به اسم new به منوی file اضافه میشه و اگر ما روی اون کلیلک کنیم کلمه ی new پرینت میشه قبلا lambda رو توضیح دادم ولی اینجا بگم که میتونید یه تابع بسازید و اینجا بجای
lambda :print("new ")
اسم تابعتون رو بنویسید تا انجام بشه
خب بعضی جاها لازمه بین ایتم های یک منو یه چیزی ایجاد کنید که از هم متمایز باشند مثلا توی منوی file گزینه های مربوط به باز کردن و خواند فایل توی یک قسمت باشند و مثلا exit توی یک قسمت دیگه برای این که بینشون یه خط ایجاد کنید تا متمایز بشند از تابع زیر استفاده میکنیم
file.add_separator()
خب برای نشون دادن یک میانبر باید به صورت زیر عمل کنیم
file.entryconfig('New',accelerator = 'Ctrl + N')
مثلا من برای new یک میانبر به اسم کنترل و ان نشون دادم البته اینجا فقط داریم نشونش میدیم و هنوز کار نمیکنه برای کارکردنش توی قسمت bind صحبت میکنیم اینجا فقط نحوه ی نشون دادنش رو گفتم
خب میتونیم داخل هر منو یک تصویر هم نشون بدیم که باید اول تصویر رو ایجاد کنیم که قبلا توضیح دادم و بعد ازش استفاده کنیم به صورت زیر
file.entryconfig('New',image=logo,compound='left')
خب compound برای اینه که بگیم عکسموت کجای نوشته بیاد برای غیر فعال کردن یک گزینه از منو به صورت زیر state اون رو disabled میکنیم
file.entryconfig('New',state='disabled')
اینطوری برای کاربر و بهش رادیو باتن اضافه میکنم
choice=IntVar()
edit.add_radiobutton(label='one',variable=choice,value=1)
برای باز کردن منو در جایی خاص از صفحه از post استفاده میکنیم که به ددر ایجاد راست کلیک میخوره که بعدا توی bind توضیح میدمش فعلا فقط نحوه ی ایجادش توی یه موقعیت خاص رو یادتون میدم
file.post(400,300)
خب اینم از این اموزش
#*************************************CODE******************************************************
from tkinter import *
from tkinter import ttk

root=Tk()

root.option_add('*tearOff',False)
menubar=Menu(root)
root.config(menu=menubar)

file=Menu(menubar)
edit=Menu(menubar)
help_=Menu(menubar)
menubar.add_cascade(menu=file,label='File')
menubar.add_cascade(menu=edit,label='edit')
menubar.add_cascade(menu=help_,label='help')


file.add_command(label='New',command=lambda :print("new "))

file.entryconfig('New',accelerator = 'Ctrl + N')

logo=PhotoImage(file="python.png").subsample(90,50)

file.entryconfig('New',image=logo,compound='left')

#file.entryconfig('New',state='disabled')

save=Menu(file)
file.add_cascade(menu=save, label='save')
save.add_command(label = 'Save As...',command=lambda :print('saved'))
file.post(400,300)
#***************************************************END******************************************************