2021-06-06 14:24:08 +00:00
|
|
|
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-'
|
|
|
|
|
2021-06-06 14:31:54 +00:00
|
|
|
def do_clipboard_operation(event, window, element):
|
2021-06-06 14:24:08 +00:00
|
|
|
if event == 'Select All':
|
2021-06-06 14:31:54 +00:00
|
|
|
element.Widget.selection_clear()
|
|
|
|
element.Widget.tag_add('sel', '1.0', 'end')
|
2021-06-06 14:24:08 +00:00
|
|
|
elif event == 'Copy':
|
|
|
|
try:
|
2021-06-06 14:31:54 +00:00
|
|
|
text = element.Widget.selection_get()
|
2021-06-06 14:24:08 +00:00
|
|
|
window.TKroot.clipboard_clear()
|
|
|
|
window.TKroot.clipboard_append(text)
|
|
|
|
except:
|
|
|
|
print('Nothing selected')
|
|
|
|
elif event == 'Paste':
|
2021-06-06 14:31:54 +00:00
|
|
|
element.Widget.insert(sg.tk.INSERT, window.TKroot.clipboard_get())
|
2021-06-06 14:24:08 +00:00
|
|
|
elif event == 'Cut':
|
|
|
|
try:
|
2021-06-06 14:31:54 +00:00
|
|
|
text = element.Widget.selection_get()
|
2021-06-06 14:24:08 +00:00
|
|
|
window.TKroot.clipboard_clear()
|
|
|
|
window.TKroot.clipboard_append(text)
|
2021-06-06 14:31:54 +00:00
|
|
|
element.update('')
|
2021-06-06 14:24:08 +00:00
|
|
|
except:
|
|
|
|
print('Nothing selected')
|
|
|
|
|
2021-06-06 14:31:54 +00:00
|
|
|
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)
|
|
|
|
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()
|