Messagebox, Menubutton, Menu, Checkbutton, add
Note that Menubutton is obsolete (a nice way of saying it is probably going to be deprecated soon) according to Python.org, Having said that…..
You don’t need to use a whole messagebar if you have just a simple menu but it seems to me the menubutton makes things a lot more complicated and actually does not free up much if any screen geography. Maybe there is a point to it that I am missing – would really love to hear from somebody who has an opinion. Be that as it may, here is an example of how it works using a general idea borrowed from Shipman.
Actually, this demo is as much about Checkbutton and Messagebox – Messagebox is not a widget but a separate module – as it is about Menubutton.
#Testing menubutton, menu, add, chekbutton, messagebox #standard set up header code 2 from tkinter import * root = Tk() root.attributes('-fullscreen', True) root.configure(background='SteelBlue4') scrW = root.winfo_screenwidth() scrH = root.winfo_screenheight() workwindow = str(1024) + "x" + str(768)+ "+" +str(int((scrW-1024)/2)) + "+" +str(int((scrH-768)/2)) top1 = Toplevel(root, bg="light blue") top1.geometry(workwindow) top1.title("Top 1 - Workwindow") top1.attributes("-topmost", 1) # make sure top1 is on top to start root.update() # but don't leave it locked in place top1.attributes("-topmost", 0) # in case you use lower or lift #exit button - note: uses grid b3=Button(root, text="Egress", command=root.destroy) b3.grid(row=0,column=0,ipadx=10, ipady=10, pady=5, padx=5, sticky = W+N) #____________________________ from tkinter import messagebox def mboxcondiments(): msgStr='mayo: '+str(mayoVar.get())+" ketchup: "+str(ketchVar.get()) messagebox.showinfo("About Condiments", msgStr, parent=top1) myMb= Menubutton (top1, text="Condiments", indicatoron=True, justify="left") #first have to create a menubutton myMb.pack(anchor=W) #pack(anchor=W) works myMb.menu= Menu(myMb, tearoff=0 ) # create a menu as a child of your Menubutton print("type: "+ str(type(myMb["menu"]))) # only doing that is not enough print("->: "+ str(myMb["menu"])) # see on your console the string is bland myMb["menu"] = myMb.menu # set the menu attribute of your Menubutton print("type: "+ str(type(myMb["menu"]))) #it still comes off as a string print("->: "+ str(myMb["menu"])) # but the string is now a pathname mayoVar= IntVar() mayoVar.set(0) #0 or 1 - defines state ketchVar= IntVar() mayoVar.set(0) # add can be cascade, checkbutton, radiobutton, separator, or command myMb.menu.add_checkbutton (label="mayo", variable= mayoVar, command= mboxcondiments) myMb.menu.add_checkbutton (label="ketchup", variable= ketchVar, command=mboxcondiments) myMb.pack() #____________________________ root.mainloop()