[Question] How to close the right_click_menu without selection of one of the items
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:
# 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 graphsSource: PySimpleGUI/PySimpleGUI