یکی از ویجتهای به درد بخور در tkinter ویجت menubutton است. این ویجت شبیه به یک منو هست اما لازم نیست در بالای پنجره و مثل منوهای دیگر قرار بگیرد. بلکه در هر جای پنجره می توان آن را قرار داد. در زیر برنامه ای را می بینید که با اجرای آن کاربر می تواند از menubutton یک گزینه را انتخاب کند و پیغام مرتبط با آن گزینه در یک لیبل نمایش داده شود:

import tkinter as tk
from tkinter import *
root = tk.Tk()
root.geometry('300x150')
root.resizable(False, False)
root.title('Button Menu karakit')
def analog():
    lbl.configure(text='Analog Circuits')
def digital():
    lbl.configure(text='Digital Circuits')
mbtn = Menubutton(root, text="category", relief="groove")
mbtn.place(height=30,width=100,x=30,y=30)
mbtn.menu=Menu(mbtn)
mbtn["menu"]=mbtn.menu  
mbtn.menu.add_command ( label="Analog", command=analog )
mbtn.menu.add_command ( label="Digital", command=digital )
lbl=Label(root, relief="groove")
lbl.place(height=30,width=100,x=170,y=30)
root.mainloop()

با اجرای برنامه پنجره به این شکل نمایش داده می شود:

tkinter menubutton

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

tkinter menubutton

با انتخاب هر یک از دو گزینه متن مربوط به آن گزینه در لیبل نمایش داده می شود:

tkinter menubutton

توضیح برنامه

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

در خط 7 تا 10 دو تابع به نامهای analog و digital تعریف کرده ایم که که در صورت فراخوانی یک متن را داخل لیبل نمایش می دهند.

در خط 11 یک ویجت menubutton با نام mbtn ایجاد می کنیم و در خط بعد ابعاد و مکان آن را مشخص می نماییم.

در خط 13 یک منو درست می کنیم و در خط 14 آن را به دکمه منو اختصاص می دهیم.

در خط 15 یک گزینه به منو اضافه می کنیم با عنوان آناللوگ که با استفاده از command مشخص کرده ایم که با کلیک روی این گزینه تابع analog فراخوانی می شود و متن مربوط به آن در لیبل نمایش داده می شود.

همین کار را در خط 16 برای گزینه digital انجام می دهیم.

سپس در خط 17 و 18 لیبل را ایجاد و جانمایی می کنیم و در پایان حلقه اصلی برنامه اضافه شده است.

نکته ای که شاید متوجه آن شده باشید خطچین بالای گزینه های داخل منو است.

tkinter menubutton

اگر کاربر روی این خط چین کلیک کند یک کپی از MENUBUTTON به صورت شناور نمایش داده می شود و کاربر می تواند آن را به هر جای صفحه جا به جا کند.

tkinter menubutton

اگر نخواهیم چنین قابلیتی وجود داشته باشد باید خط 13 را به این صورت تغییر دهیم:

Mbtn.menu=Menu(mbtn, tearoff=0)

با اختصاص مقدار 0 به پارامتر tearoff خط چین دیگر مشاهده نمی شود و کاربر نمی تواند دکمه منو را جابه جا کند.

tkinter menubutton

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