[Tkinter-discuss] Binding custom events from a Menu on Windows

alan moore me at alandmoore.com
Tue Apr 27 16:07:42 EDT 2021


Hello,

I've recently stumbled on a problem while working with the Menu object 
on both Linux and Windows.

I'm trying to create a loosely-coupled menu object, so rather than 
calling commands directly I'm generating custom events.  The main 
application object then binds callback methods to those custom events.

This example shows the basic approach:

**** EXAMPLE FOLLOWS ****

import tkinter as tk


root = tk.Tk()
root.geometry('300x200')
label = tk.Label(text='Test')
label.grid()
menu = tk.Menu(root)

root.configure(menu=menu)

submenu = tk.Menu(menu)
menu.add_cascade(menu=submenu, label='Change Text')
submenu.add_command(
     label='Foo',
     command=lambda: menu.event_generate('<<Foo>>')
)
submenu.add_command(
     label='Bar',
     command=lambda: menu.event_generate('<<Bar>>')
)

def setfoo(*_):
     label.configure(text='Foo')

def setbar(*_):
     label.configure(text='Bar')

menu.bind('<<Foo>>', setfoo)
menu.bind('<<Bar>>', setbar)

print(menu.bind())
root.mainloop()


**** END EXAMPLE ****

This code works as expected on Linux, but does not work at all on 
Windows.  The callback are never executed.  I suspect this has to do 
with the way menus are implemented on Windows; I know I can 
generate/bind events on the root window as a workaround, but should this 
work as-is?


( PS -- I posted this to stackoverflow, if anyone is interested in 
replying there:  https://stackoverflow.com/q/67289539/1454109 )


Regards,

Alan Moore



More information about the Tkinter-discuss mailing list