Hi Michael, here is a snipped of a code and what I've managed up to now Mouse left click opens a standard menu with columns Mouse right click opens the same menu with columns and my first try to create a Left/Right keyboard bindings to navigate in the columns. My attempt fails on the first row and the last column...
best Vasilis import tkinter as tk # ------------------------------------------------------------------------------ # Right key menu handler # ------------------------------------------------------------------------------ def menuRight(event): menu = event.widget index = menu.index(tk.ACTIVE) last = menu.index(tk.LAST) ypos = menu.yposition(index) yprev = ypos for i in range(index+1, last): if yprev < ypos <= menu.yposition(i): # WARNING empty entries appear as command without a label! # ignore them if menu.entrycget(i,"label") != "": menu.activate(i) return "break" yprev = menu.yposition(i) # ------------------------------------------------------------------------------ # Left key menu handler # ------------------------------------------------------------------------------ def menuLeft(event): menu = event.widget index = menu.index(tk.ACTIVE) ypos = menu.yposition(index) yprev = ypos for i in range(index-1, -1, -1): if menu.yposition(i) <= ypos < yprev: # WARNING empty entries appear as command without a label! # ignore them if menu.entrycget(i,"label") != "": menu.activate(i) return "break" yprev = menu.yposition(i) #------------------------------------------------------------------------------- def show_menu(event, with_binding): global root menu = tk.Menu(root) for label in ["one","two","three","four"]: submenu = tk.Menu(menu) menu.add_cascade(label=label, menu=submenu) for i in range(101): submenu.add_command(label=f"Item #{i}") if i and i%20==0: submenu.entryconfigure(i, columnbreak=1) if with_binding: submenu.bind("<Right>", menuRight) submenu.bind("<Left>", menuLeft) if with_binding: menu.bind("<Right>", menuRight) menu.bind("<Left>", menuLeft) menu.tk_popup(event.x_root, event.y_root) #------------------------------------------------------------------------------- if __name__ == "__main__": root = tk.Tk() tk.Label(root, text="<1> Left click to show menu without Left/Right binding").pack() tk.Label(root, text="<3> Right click to show menu with Left/Right binding").pack() tk.Label(root, text="<q> to exit").pack() root.bind("<1>", lambda e: show_menu(e,False)) root.bind("<3>", lambda e: show_menu(e,True)) root.bind("<Key-q>", lambda e: root.destroy()) root.mainloop() ________________________________ From: Tkinter-discuss <tkinter-discuss-bounces+vasilis.vlachoudis=cern...@python.org> on behalf of Michael Lange <klappn...@web.de> Sent: Thursday 14 September 2023 09:45 To: tkinter-discuss@python.org <tkinter-discuss@python.org> Subject: Re: [Tkinter-discuss] Navigation in menu with multiple columns Hi Vasilis, On Wed, 13 Sep 2023 15:57:10 +0000 Vasilis Vlachoudis <vasilis.vlachou...@cern.ch> wrote: > In my application I am dynamically creating cascading menus, where some > of them have multiple entries. To imrpove the visualization I break > them into multiple columns using the "columnbreak=1" attribute in the > Menu.add_command() > > The Up/Down keys move correctly the active/highlighted entry up/down > > However the Left key closes always the cascade submenu, while I would > prefer to highlight the entry on the left column, and when it is on the > left-most column to close the cascade submenu Is there a way to bind > the Left/Right keys to move left/right in the columns? > > Vasilis could you please post a simple example that shows this behaviour? Have a nice day, Michael .-.. .. ...- . .-.. --- -. --. .- -. -.. .--. .-. --- ... .--. . .-. Peace was the way. -- Kirk, "The City on the Edge of Forever", stardate unknown _______________________________________________ Tkinter-discuss mailing list Tkinter-discuss@python.org https://mail.python.org/mailman/listinfo/tkinter-discuss
_______________________________________________ Tkinter-discuss mailing list Tkinter-discuss@python.org https://mail.python.org/mailman/listinfo/tkinter-discuss