Replaced old MenubarCustom with the new one built into PySimpleGUI

This commit is contained in:
PySimpleGUI 2021-05-20 15:07:05 -04:00
parent dd25e39d13
commit a1c1ba463a
1 changed files with 36 additions and 55 deletions

View File

@ -1,92 +1,73 @@
#!/usr/bin/env python #!/usr/bin/env python
import PySimpleGUI as sg import PySimpleGUI as sg
""" """
Demo - A Custom Menubar Element Simulated Using ButtonMenu Elements Demo - The MenubarCustom element
With the addition of the Custom Titlebar came the addition of a problem with the
os provided menubar. It's not possible to use the custom titlebar with the
normal menubar. The menubar ends up being placed above the titlebar.
Enter the MenubarCustom!
This "Compound Element" is not really an element but rather a combination of
ButtonMenu elements and Column elements. It's possible for users to create a similar
construct. In fact, this element started as a Demo Program and then migrated into PySimpleGUI.
Because a Menubar is created by the OS and not the underlying GUI framework, the At the moment, you cannot perform all of the same operations using this custom menubar
ability to customize the look and feel of the standard Menubar is not possible. that you can with a traditional menubar. Modifying the menu isn't possible yet. In
other words, it's a great start, but more work is needed such as adding an update method, etc.
Additionally, the Titlebar Element and the Meny Element don't work well together.
The order gets swapped. For statically defined menus, it works great. Shortuts are possible within the menus, but not
for the initial selection.
One way to get around all of the problems above is to simulate a Menu Element.
That's exactly what this demo does. You can use the same menu defition as the standard Menu element.
The Menubar will tbe themed according to your current theme's colors. The theme's button
colors are used. All of the colors can be changed from the menubar to the menu's text an background.
The disabled color has a problem. The default tkinter gray is used even though PySimpleGUI sets the value.
The color choice for the menubar background and text use the theme's button colors. The color choice for the menubar background and text use the theme's button colors.
You can change these color choices by changing the Menubar in the layout. You can change these color choices by changing the Menubar in the layout.
Copyright 2021 PySimpleGUI Copyright 2021 PySimpleGUI
""" """
sg.MENU_SHORTCUT_CHARACTER = '&'
def Menubar(menu_def, text_color, background_color, pad=(0, 0)):
"""
A User Defined element that simulates a Menu element by using ButtonMenu elements
:param menu_def: A standard PySimpleGUI menu definition
:type menu_def: List[List[Tuple[str, List[str]]]
:param text_color: color for the menubar's text
:type text_color:
:param background_color: color for the menubar's background
:type background_color:
:param pad: Amount of padding around each menu entry
:type pad:
:return: A column element that has a row of ButtonMenu buttons
:rtype: sg.Column
"""
row = []
for menu in menu_def:
text = menu[0]
if sg.MENU_SHORTCUT_CHARACTER in text:
text = text.replace(sg.MENU_SHORTCUT_CHARACTER, '')
if text.startswith(sg.MENU_DISABLED_CHARACTER):
disabled = True
text = text[len(sg.MENU_DISABLED_CHARACTER):]
else:
disabled = False
row += [sg.ButtonMenu(text, menu, border_width=0, button_color=f'{text_color} on {background_color}',key=text, pad=pad, disabled=disabled)]
return sg.Column([row], background_color=background_color, pad=(0,0), expand_x=True)
def main(): def main():
sg.theme('dark green 7') sg.theme('dark green 7')
# sg.theme('dark gray 14') # sg.theme('dark gray 13')
sg.theme('dark red')
# sg.theme('black')
menu_def = [['&File', ['&Open Ctrl-O', '&Save Ctrl-S', '&Properties', 'E&xit']], menu_def = [['&File', ['&Open Ctrl-O', '&Save Ctrl-S', '&Properties', 'E&xit']],
['&Edit', [['Special', 'Normal',['Normal1', 'Normal2'] ], 'Undo'], ], ['&Edit', ['Me', 'Special', 'Normal',['Normal1', 'Normal2'] , 'Undo']],
['!Disabled', [['Special', 'Normal',['Normal1', 'Normal2'] ], 'Undo'], ], ['!Disabled', ['Special', 'Normal',['Normal1', 'Normal2'], 'Undo']],
['&Toolbar', ['---', 'Command &1::Command_Key', 'Command &2', '---', 'Command &3', 'Command &4']], ['&Toolbar', ['---', 'Command &1::Command_Key', 'Command &2', '---', 'Command &3', 'Command &4']],
['&Help', ['&About...']], ] ['&Help', ['&About...']], ]
layout = [ layout = [[sg.MenubarCustom(menu_def, pad=(0,0), k='-CUST MENUBAR-')],
# [sg.Menu(menu_def, tearoff=False, key='-MENU BAR-')], # This is how a Menu is normally defined [sg.Multiline(size=(70, 20), reroute_cprint=True, write_only=True, no_scrollbar=True, k='-MLINE-')]]
[Menubar(menu_def, sg.theme_button_color()[1], sg.theme_button_color()[0], (5, 0))],
[sg.Multiline(size=(70, 20), reroute_stdout=True, reroute_cprint=True, write_only=True)],
]
window = sg.Window("Custom Titlebar with Custom (Simulated) Menubar", layout, use_custom_titlebar=True) window = sg.Window("Custom Titlebar with Custom (Simulated) Menubar", layout, use_custom_titlebar=True, keep_on_top=True)
# ------ Event Loop ------ # # ------ Event Loop ------ #
while True: while True:
event, values = window.read() event, values = window.read()
# convert ButtonMenu event so they look like Menu events # convert ButtonMenu event so they look like Menu events
elem = window.find_element(event, silent_on_error=True)
if elem and elem.Type == sg.ELEM_TYPE_BUTTONMENU:
event = values[event]
if event in (sg.WIN_CLOSED, 'Exit'): if event in (sg.WIN_CLOSED, 'Exit'):
break break
sg.cprint(f'event = {event}', c='white on red') sg.cprint(f'event = {event}', c=(sg.theme_background_color(), sg.theme_text_color()))
sg.cprint(f'values = {values}', c='white on green') sg.cprint(f'values = {values}',c=(sg.theme_input_text_color(), sg.theme_input_background_color()))
# ------ Process menu choices ------ # # ------ Process menu choices ------ #
if event == 'About...': if event == 'About...':
window.disappear() window.disappear()
sg.popup('About this program', 'Simulated Menubar to accompany a simulated Titlebar', sg.popup('About this program', 'Simulated Menubar to accompany a simulated Titlebar',
'PySimpleGUI Version', sg.version, grab_anywhere=True, keep_on_top=True) 'PySimpleGUI Version', sg.get_versions(), grab_anywhere=True, keep_on_top=True)
window.reappear() window.reappear()
elif event == 'Me':
sg.execute_editor(__file__)
elif event.startswith('Open'): elif event.startswith('Open'):
filename = sg.popup_get_file('file to open', no_window=True) filename = sg.popup_get_file('file to open', no_window=True)
print(filename) print(filename)