Search code examples
pythonmenupopuptkintercontextmenu

Stardand context menu in Python TKinter text widget when mouse right button is pressed


I'm working on Windows XP, with Python 2.6.x and TKinter. Using a text widget in the app, but the standard popup menu (cut, copy, paste, delete, select all) is missing. How to make it appear?


Solution

  • I found a way, thanks to this post. I made some modifications. At the bottom part there's a minimal main to try it.

    from Tkinter import *
    
    def rClicker(e):
        ''' right click context menu for all Tk Entry and Text widgets
        '''
    
        try:
            def rClick_Copy(e, apnd=0):
                e.widget.event_generate('<Control-c>')
    
            def rClick_Cut(e):
                e.widget.event_generate('<Control-x>')
    
            def rClick_Paste(e):
                e.widget.event_generate('<Control-v>')
    
            e.widget.focus()
    
            nclst=[
                   (' Cut', lambda e=e: rClick_Cut(e)),
                   (' Copy', lambda e=e: rClick_Copy(e)),
                   (' Paste', lambda e=e: rClick_Paste(e)),
                   ]
    
            rmenu = Menu(None, tearoff=0, takefocus=0)
    
            for (txt, cmd) in nclst:
                rmenu.add_command(label=txt, command=cmd)
    
            rmenu.tk_popup(e.x_root+40, e.y_root+10,entry="0")
    
        except TclError:
            print ' - rClick menu, something wrong'
            pass
    
        return "break"
    
    
    def rClickbinder(r):
    
        try:
            for b in [ 'Text', 'Entry', 'Listbox', 'Label']: #
                r.bind_class(b, sequence='<Button-3>',
                             func=rClicker, add='')
        except TclError:
            print ' - rClickbinder, something wrong'
            pass
    
    
    if __name__ == '__main__':
        master = Tk()
        ent = Entry(master, width=50)
        ent.pack(anchor="w")
    
        #bind context menu to a specific element
        ent.bind('<Button-3>',rClicker, add='')
        #or bind it to any Text/Entry/Listbox/Label element
        #rClickbinder(master)
    
        master.mainloop()