در بسیاری از نرم افزارهایی که با آنها کار کرده اید ، منوهای مختبف را دیده اید که هر کدام شامل گزینه هایی هستند و با کلیک روی هر کدام اتفاق مربوط به آن رخ می دهد. طبیعتا tkinter نیز به عنوان یک ابزار طراحی رابط گرافیکی کاربر یا همان GUI امکان ایجاد منو را فراهم می کند.

برای آشنایی با این ویجت برنامه ای می نویسیم که در بالای پنجره یک نوار منو ایجاد کند و در آن 2 منو دیده شود و هر کدام قابلیت باز شدن داشته باشند و با کلیک روی گزینه های داخل منوها اتفاق مربوط به آن رخ خواهد داد.

شکل نهایی رابط کاربری به این شکل خواهد بود:

tkinter menu

برنامه را در زیر می بینید:

import tkinter as tk
from tkinter import *
from tkinter import messagebox
root = tk.Tk()
root.geometry('300x150')
root.resizable(False, False)
root.title('Menu karakit')
def sayhello():
    tk.messagebox.showinfo(title='Karakit message', message='Hello world!')
def showabout():
    tk.messagebox.showinfo(title='Karakit Menu', message='This program is made by karakit to show you how to add menus to your GUI.')
menubar = Menu(root)
root.config(menu=menubar)
mainmenu=Menu(menubar)
menubar.add_cascade(label="Main", menu=mainmenu)
mainmenu.add_command(label="Hello", command=sayhello)
mainmenu.add_separator()
mainmenu.add_command(label="Quit!", command=root.quit)
helpmenu=Menu(menubar)
menubar.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About", command=showabout)
root.mainloop()

توضیح برنامه

خطوط 1 تا 7 مربوط به احضار کتابخانه های مورد نیازجمله messagebox و ایجاد پنجره اصلی هستند.

در خط 8 تا 11 دو تابع تعریف شده اند که قرار است موقع کلیک روی منوها اجرا شوند و بعدا به آن می پردازیم.

در خط 12 نوار منوی رابط کاربری را با نام menubar ایجاد می کنیم و در خط بعدی تعیین می کنیم که همین نوار منو در پنجره برنامه نمایش داده شود.

حالا باید منوهایی را که می خواهیم ایجاد کنیم در نوار منو قرار دهیم. بنابراین در خط 14 منوی mainmenu را ایجاد می کنیم و تعیین می کنیم که در نوار منوی menubar قرار گیرد.

در خط بعدی با استفاده از دستور add_cascade منوی mainmenu را به صورت یک منوی بازشونده آبشاری به نوار ابزار menubar اضافه می کنیم و عنوانی را که نمایش می دهد Main تعیین می کنیم.

برای اضافه کردن گزینه های داخل منوی mainmenu باید از دستور add_command استفاده کنیم. با استفاده از همین دستور در خط 16 یک گزینه با عنوان Hello اضافه می کنیم و با خصوصیت command مشخص می کنیم که با کلیک روی آن تابع sayhello فراخوانی و اجرا شود. این تابع یک پیغام ساده را نمایش می دهد.

برای اینکه بین این گزینه و گزینه بعدی داخل یک منو فاصله بیندازیم در خط 17 از دستور add_seperator استفاده کرده ایم.

در خط 18 یک گزینه دیگر با عنوان Quit! به منوی mainmenu اضافه می کنیم که با کلیک روی آن دستور root.quit اجرا می شود. همان طور که می بینید این بار به هیچ تابعی که خودمان نوشته باشیم ارجاع داده نشده است و مستقیما یک تابع داخلی  خصوصیت command اختصاص داده شده است. با اجرای این تابع پنجره بسته می شود و اجرای برنامه خاتمه می یابد.

حالا در خط 19 برای اینکه یک منوی دیگر در کنار منوی mainmenu در نوار منو اضافه کنیم دوباره با استفاده از دستور add_cascade یک منو با نام helpmenu ایجاد می کنیم که عنوان آن Help است.

قصد داریم در این منو فقط یک گزینه با عنوان about اضافه کنیم. بنایراین در خط بعد مجددا با استفاده از add_command این گزینه را به helpmenu  اضافه می کنیم و تعیین می کنیم که با کلیک روی آن تابع showabout اجرا شود. با اجرای این تابع یک پیغام ظاهر می شود که توضیحاتی درباره برنامه ارایه می دهد.

در پایان حلقه اصلی برنامه قرار دارد.

با اجرای برنامه پنجره به این صورت ظاهر می شود:

tkinter menu

با باز کردن منوی Main می بینیم که دو گزینه Hello و Quit! دیده می شوند:

tkinter menu
tkinter menu

اگر روی Hello کلیک شود پیغام زیر نمایش داده می شود:

tkinter menu

با کلیک روی منوی Help گزینه About ظاهر می شود:

tkinter menu

با کلیک روی About پیغام زیر نمایش داده می شود:

tkinter menu

و در آخر با کلیک روی Quit! در منوی Main برنامه بسته می شود و اجرای آن پایان می یابد.

کلید میانبر یا شورتکی برای منوها

یک قابلیت دیگر که می توان به منوها اضافه کرد تعیین کلید میانبر است. مثلا تعیین کلیدهای ترکیبی ctrl + H که معمولا برای باز کردن راهنما به کار می رود. در زیر برنامه را به نحوی تغییر داده ایم که دو زیرمنو دارای کلیدهای میانبر هستند. وقتی که از addcommand استفاده می کنیم باید با استفاده از accelerator مشخص کنیم که چه کلیدهای میانبری برای این زیرمنو اضافه شود.

همچنین باید بعدا با استفاده از bind و یا bind_all به برنامه اعلاک کنیم که با فشردن این کلیدهای ترکیبی چه اتفاقی باید بیفتد.

باید توابع مورد نیاز را نیز اضافه کنیم و موقع بایند کردن به این توابع ارجاع دهیم.

import tkinter as tk
from tkinter import *
from tkinter import messagebox
root = tk.Tk()
root.geometry('300x150')
root.resizable(False, False)
root.title('Menu karakit')
def exit(self):
    root.quit()
def sayhello():
    tk.messagebox.showinfo(title='Karakit message', message='Hello world!') 
def showabout():
    tk.messagebox.showinfo(title='Karakit Menu', message='This program is made by karakit to show you how to add menus to your GUI.')
def showabout2(self):
    tk.messagebox.showinfo(title='Karakit Menu', message='This program is made by karakit to show you how to add menus to your GUI.')
menubar = Menu(root)
root.config(menu=menubar)
mainmenu=Menu(menubar)
menubar.add_cascade(label="Main", menu=mainmenu)
mainmenu.add_command(label="Hello", command=sayhello)
mainmenu.add_separator()
mainmenu.add_command(label="Quit!", command=root.quit,accelerator="Ctrl+Q")
helpmenu=Menu(menubar)
menubar.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About", command=showabout,accelerator="Ctrl+H")
root.bind_all('<Control-h>', showabout2)
root.bind_all('<Control-q>', exit)
root.mainloop()

می توانید در زیر شکل ظاهری منوها را پس از اضافه کردن کلیدهای میانبر ببینید:

زیرمنوی Quit
زیرمنوی About

آموزشهای ابزار طراحی GUI در پایتون: tkinter