Menu

نوار منو (Menu)، در اکثر برنامه به چشم می‌خورد. این نوار، شامل دستورات مختلفی است که، کاربر از آنها استفاده می‌کند:
menu-in-tkinter-01
در tkinter با استفاده از کنترل Menu می‌توان یک منو به برنامه اضافه کرد. نحوه ایجاد منو به صورت زیر است:

Menu ( master, option, ... )

master، بیانگر پنجره والدی است که این دکمه به آن تعلق خواهد داشت و options، تنظیمات پرکاربرد برای Menu می‌باشند که می‌توانند به صورت زوج‌های کلید/مقدار که با ویرگول از هم جدا می‌شوند، مورد استفاده قرار گیرند. در جدول زیر لیست این تنظیمات آمده است:

تنظیمات شرح
activebackground رنگ پس زمینه زمانی که نشانگر ماوس بر روی یک گزینه قرار می‌گیرد.
activeborderwidth پهنای خط حاشیه گزینه‌ای که زیر نشانگر ماوس قرار دارد. پیش فرض 1 پیکسل است.
activeforeground رنگ متن زمانی که نشانگر ماوس بر روی آن گزینه قرار می‌گیرد.
bd پهنای خط حاشیه گزینه‌های منو در حالت عادی. مقدار پیش فرض 1 است.
bg رنگ پس زمینه گزینه‌هایی که ماوس بر روی آنها قرار ندارد.
cursor نشانگر ماوس زمانی که بر روی گزینه‌ها قرار می‌گیرد. تنها برای منوهای جداشده اعمال می‌شود.
disabledforeground رنگ متن آیتم‌هایی که در وضعیت DISABLED قرار دارند.
fg رنگ متن گزینه‌هایی که ماوس بر روی آنها نیست.
font فونت متن گزینه‌های متنی
postcommand می‌توانید یک تابع را به این گزینه نسبت دهید. هر زمان این منو فعال شود، تابع مورد نظر فراخوانی می‌گردد.
relief افکت سه بعدی پیش فرض برای منو RAISED است.
image برای نمایش یک تصویر بر روی menubutton
selectcolor رنگی که checkbutton و radiobutton در زمان انتخاب شدن به خود می‌گیرند را مشخص می‌کند.
tearoff به طور معمول منوها می‌توانند جدا شوند. اولین گزینه در لیست هر منو (در موقعیت صفر) گزینه tear-off قرار می‌گیرد. گزینه‌های بعدی در موقعیت 1 به بعد قرار می‌گیرند. اگر شما tearoff=0 قرار دهید، منو دارای گزینه tear-off نخواهد بود و گزینه‌های منو در موقعیت صفر به بعد اضافه می‌شوند.
title در حالت عادی، عنوان پنجره منویی که جدا شده است، همان متن menubutton یا cascade مربوط به آن می‌باشد. اگر می‌خواهید عنوان پنجره جدا شده را تغییر دهید، متن مورد نظر خود را به title انتساب دهید/

این توابع برای شیء Menu وجود دارند.

تابع شرح
add_command(options) یک آیتم به منو اضافه می‌کند.
add_radiobutton(options) یک آیتم از نوع radiobutton به منو اضافه می‌کند.
add_checkbutton(options) یک آیتم از نوع checkbutton به منو اضافه می‌کند.
add_cascade(options) منوی دریافتی را به عنوان زیر شاخه به منوی اصلی اضافه می‌کند.
()add_separator یک خط جدا کننده به منو اضافه می‌کند.
add(type, options) یک آیتم از نوع مشخص شده به وسیله type به منو اضافه می‌کند.
delete(startindex [, endindex ]) آیتم‌های منو را از startindex تا endindex حذف می‌کند.
entryconfig(index, options) امکان تغییر تنظیمات آیتم در موقعیت index را فراهم می‌آورد.
index(item) شماره اندیس item را در منو بر می‌گرداند.
insert_separator(index) یک خط جدا کننده در موقعیت index به منو اضافه می‌کند.
invoke(index) تابع انتساب یافته به command آیتم در موقعیت index را فراخوانی می‌کند. اگر آیتم مربوطه checkbutton باشد، وضعیت آن تغییر می‌کند. اگر radiobutton باشد، آن آیتم فعال می‌شود.
type(index) نوع آیتم در موقعیت index را بر می‌گرداند. یکی از مقادیر cascade ،checkbutton ،command ،radiobutton ،separator یا tearoff

حال اجازه دهید که وارد قسمت کدنویسی شده و نوار منوی بالا را شبیه سازی کنیم. به کد زیر توجه کنید :

  1: import tkinter
  2: from tkinter import *
  3: 
  4: window = tkinter.Tk()
  5: window.geometry('300x200')
  6: 
  7: menubar    = Menu(window)
  8: filemenu   = Menu(menubar, tearoff=0)
  9: editmenu   = Menu(menubar, tearoff=0)
 10: formatmenu = Menu(menubar, tearoff=0)
 11: helpmenu   = Menu(menubar, tearoff=0)
 12: 
 13: 
 14: subfilemenu =  Menu(filemenu, tearoff=0)
 15: subfilemenu.add_command(label='New Documnet')
 16: filemenu.add_cascade(label='New' , accelerator="Ctrl+N", menu=subfilemenu)
 17: filemenu.add_command(label='Open', accelerator="Ctrl+O", underline=0)
 18: filemenu.add_separator()
 19: filemenu.add_command(label='Quit', accelerator="Ctrl+Q")
 20: 
 21: 
 22: state = BooleanVar()
 23: state.set(True)
 24: formatmenu.add_checkbutton(label='Word Wrap', onvalue=True, offvalue=0, variable=state)
 25: 
 26: 
 27: menubar.add_cascade(label='File'  , menu=filemenu)
 28: menubar.add_cascade(label="Edit"  , menu=editmenu)
 29: menubar.add_cascade(label="Format", menu=formatmenu)
 30: menubar.add_cascade(label="Help"  , menu=helpmenu)
 31: 
 32: window.config(menu=menubar)
 33: window.mainloop()

نگران کدهای بالا نباشید. تمامی آنها را خط به خط توضیح می‌دهیم. در کد بالا و در خط 7 به برنامه می‌فهمانیم که می‌خواهیم یک منو به برنامه اضافه کنیم. در خطوط 11-8 ما چهار زیر منو ایجاد کرده و سپس در خطوط 30-27 و با استفاده از متد ()add_cascade آن‌ها را به منوی اصلی اضافه می‌کنیم. نکته‌ای که نباید فراموش شود این است که در خط 7 و در داخل پرانتز نوشته‌ایم window، که به معنای این است که منوی اصلی قرار است به پنجره اصلی اضافه شود و در خطوط 11-8 و در داخل پرانتز نوشته‌ایم menubar، که به معنای این است که این گزینه‌ها قرار است به منوی اصلی اضافه شوند. اگر خطوط 24-14 را حذف و برنامه را اجرا کنید، پنجره به شکل زیر نمایش داده می‌شود:
menu-in-tkinter-02
حال نوبت به اجرای زیر منو برای گزینه File می‌رسد. در خطوط 14 یک منو با نام subfilemenu ایجاد کرده و در داخل پرانتز آن نامی که به منوی File در خط 8 اختصاص داده‌ایم یعنی filemenu را می‌نویسیم. این بدین معنی است که subfilemenu قرار است به منوی File اضافه شود. در خط 15 یک گزینه را با استفاده از متد ()add_command به subfilemenu اضافه کرده و سپس در خط 16 یک منوی آبشاری را با استفاده از متد ()add_cascade و با نام New در داخل منوی File ایجاد کرده و subfilemenu را به آن اضافه می‌کنیم. در خط 17 و 19 دو گزینه دیگر را با استفاده از متد ()add_command به منوی File کرده و از متد ()add_separator هم برای ایجاد یک جدا کننده استفاده می‌کنیم (خط 18) :
menu-in-tkinter-03