[Question] How to close the right_click_menu without selection of one of the items

Author: MMscriptsCreated Feb 1, 2024Updated Sep 8, 2026
LabelsQuestionPort - TKPlatform Specific Issue - Linux

Type of Issue (Enhancement, Error, Bug, Question)

I wonder how to close the right_click_menu (after it has been opened with a right mouse click), by a left click on another part of the window or screen. Just as is common in Linux or Windows. It turns out that this is not happening when I e.g. run the demo Demo_Multiline_Right_Click_Menu_Clipboard.py After appearance of the right_click_menu, it does not close and disappear when e.g. selecting another window. It even stays on top.


Operating System

Ubuntu 22.04.3 LTS

PySimpleGUI Port (tkinter, Qt, Wx, Web)


Versions

*** Version information copied to your clipboard. Paste into your GitHub Issue. ***

Python version: 3.9.16 (main, Jan 11 2023, 16:05:54) [GCC 11.2.0] tkinter version: 8.6.12 PySimpleGUI version: 4.60.4


Your Experience In Months or Years (optional)

Years Python programming experience 8

Years Programming experience overall 40

Have used another Python GUI Framework? (tkinter, Qt, etc) (yes/no is fine)

Anything else you think would be helpful?


Troubleshooting

These items may solve your problem. Please check those you've done by changing - [ ] to - [X]

  • [x ] Searched main docs for your problem www.PySimpleGUI.org
  • Looked for Demo Programs that are similar to your goal. It is recommend you use the Demo Browser! Demos.PySimpleGUI.org
  • [x ] None of your GUI code was generated by an AI algorithm like GPT
  • If not tkinter - looked for Demo Programs for specific port
  • For non tkinter - Looked at readme for your specific port if not PySimpleGUI (Qt, WX, Remi)
  • [ x] Run your program outside of your debugger (from a command line)
  • [x ] Searched through Issues (open and closed) to see if already reported Issues.PySimpleGUI.org
  • Have upgraded to the latest release of PySimpleGUI on PyPI (lastest official version)
  • Tried using the PySimpleGUI.py file on GitHub. Your problem may have already been fixed but not released

Detailed Description

Code To Duplicate

A short program that isolates and demonstrates the problem (Do not paste your massive program, but instead 10-20 lines that clearly show the problem)

This pre-formatted code block is all set for you to paste in your bit of code:

python

# Paste your code here

import PySimpleGUI as sg

"""
    Demo - Adding a right click menu to perform multiline element common operations

    Sometimes Multiline Elements can benefit from a right click menu. There are no default menu
    that come with tkinter, so you'll need to create your own.

    Some common clipboard types of operations
        Select all
        Copy
        Paste
        Cut

    The underlying Widget is accessed several times in this code because setting selections,
    getting their values, and clipboard operations are not currently exposed in the APIs

    NOTE - With tkinter, if you use the built-in clipboard, you must keep your program
    running in order to access the clipboard.  Upon exit, your clipboard will be deleted.
    You can get around this by using other clipboard packages.

    Copyright 2021 PySimpleGUI
"""

right_click_menu = ["", ["Copy", "Paste", "Select All", "Cut"]]
MLINE_KEY = "-MLINE-"


def do_clipboard_operation(event, window, element):
    if event == "Select All":
        element.Widget.selection_clear()
        element.Widget.tag_add("sel", "1.0", "end")
    elif event == "Copy":
        try:
            text = element.Widget.selection_get()
            window.TKroot.clipboard_clear()
            window.TKroot.clipboard_append(text)
        except:
            print("Nothing selected")
    elif event == "Paste":
        element.Widget.insert(sg.tk.INSERT, window.TKroot.clipboard_get())
    elif event == "Cut":
        try:
            text = element.Widget.selection_get()
            window.TKroot.clipboard_clear()
            window.TKroot.clipboard_append(text)
            element.update("")
        except:
            print("Nothing selected")


def main():
    layout = [
        [sg.Text("Using a custom right click menu with Multiline Element")],
        [sg.Multiline(size=(60, 20), key=MLINE_KEY, right_click_menu=right_click_menu)],
        [sg.B("Go"), sg.B("Exit")],
    ]

    window = sg.Window("Right Click Menu Multiline", layout)

    mline: sg.Multiline = window[MLINE_KEY]

    while True:
        event, values = window.read()  # type: (str, dict)
        print("Event: ", event, " Values: ", values)
        if event in (sg.WIN_CLOSED, "Exit"):
            break

        # if event is a right click menu for the multiline, then handle the event in func
        if event in right_click_menu[1]:
            do_clipboard_operation(event, window, mline)

    window.close()


if __name__ == "__main__":
    main()
#### Screenshot, Sketch, or Drawing

---------------------

### Watcha Makin?

If you care to share something about your project, it would be awesome to hear what you're building.
A gui interface for plotting graphs