Merge pull request #178 from MikeTheWatchGuy/Dev-latest

Dev latest
This commit is contained in:
MikeTheWatchGuy 2018-09-09 23:31:30 -04:00 committed by GitHub
commit 294b7345a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 96 additions and 13 deletions

View File

@ -15,13 +15,13 @@ import time
def Timer(): def Timer():
# ---------------- Create Form ---------------- # ---------------- Create Form ----------------
sg.ChangeLookAndFeel('Dark') sg.ChangeLookAndFeel('Black')
sg.SetOptions(element_padding=(0,0)) sg.SetOptions(element_padding=(0,0))
# Make a form, but don't use context manager # Make a form, but don't use context manager
# Create the form layout # Create the form layout
form_rows = [[sg.Text('')], form_rows = [[sg.Text('')],
[sg.Text('', size=(8, 2), font=('Helvetica', 20), justification='center', key='text')], [sg.Text('', size=(8, 2), font=('Helvetica', 20), justification='center', key='text')],
[sg.ReadFormButton('Pause', key='button'), sg.ReadFormButton('Reset'), sg.Exit(button_color=('white','firebrick4'))]] [sg.ReadFormButton('Pause', key='button', button_color=('white', '#001480')), sg.ReadFormButton('Reset', button_color=('white', '#007339')), sg.Exit(button_color=('white','firebrick4'))]]
# Layout the rows of the form and perform a read. Indicate the form is non-blocking! # Layout the rows of the form and perform a read. Indicate the form is non-blocking!
form = sg.FlexForm('Running Timer', no_titlebar=True, auto_size_buttons=False, keep_on_top=True, grab_anywhere=True) form = sg.FlexForm('Running Timer', no_titlebar=True, auto_size_buttons=False, keep_on_top=True, grab_anywhere=True)
form.Layout(form_rows) form.Layout(form_rows)

42
Demo_Menus.py Normal file
View File

@ -0,0 +1,42 @@
import PySimpleGUI as sg
"""
Demonstration of MENUS!
How do menus work? Like buttons is how.
Check out the variable menu_def for a hint on how to
define menus
"""
def TestMenus():
import PySimpleGUI as sg
sg.ChangeLookAndFeel('LightGreen')
sg.SetOptions(element_padding=(0, 0))
menu_def = [['File', ['Open', 'Save',]],
['Edit', ['Paste', ['Special', 'Normal',], 'Undo'],],
['Help', 'About...'],]
layout = [
[sg.Menu(menu_def)],
[sg.Output(size=(60,20))]
]
form = sg.FlexForm("Windows-like program", default_element_size=(12, 1), auto_size_text=False, auto_size_buttons=False,
default_button_element_size=(12, 1))
form.Layout(layout)
form.ReadNonBlocking() # so the print message will show up... yes, a kludge
print('Give those menus a try!')
while True:
button, values = form.Read()
if button is None or button == 'Exit':
return
print('Button = ', button)
if button == 'About...':
sg.Popup('About this program','Version 1.0', 'PySimpleGUI rocks...')
elif button == 'Open':
filename = sg.PopupGetFile('file to open', no_window=True)
print(filename)
TestMenus()

View File

@ -923,8 +923,6 @@ class Button(Element):
self.TKButton.config(foreground=button_color[0], background=button_color[1]) self.TKButton.config(foreground=button_color[0], background=button_color[1])
except: except:
return return
if new_text is not None:
self.ButtonText = new_text
self.DefaultValue = value self.DefaultValue = value
def __del__(self): def __del__(self):
@ -1432,10 +1430,10 @@ class TKCalendar(ttk.Frame):
# Canvas # # Canvas #
# ---------------------------------------------------------------------- # # ---------------------------------------------------------------------- #
class Menu(Element): class Menu(Element):
def __init__(self, text, command=None, background_color=None, scale=(None, None), size=(None, None), pad=None, key=None): def __init__(self, menu_definition, command=None, background_color=None, scale=(None, None), size=(None, None), pad=None, key=None):
self.BackgroundColor = background_color if background_color is not None else DEFAULT_BACKGROUND_COLOR self.BackgroundColor = background_color if background_color is not None else DEFAULT_BACKGROUND_COLOR
self.Command = command self.Command = command
self.Text = text self.MenuDefinition = menu_definition
self.TKMenu = None self.TKMenu = None
super().__init__(ELEM_TYPE_MENUBAR, background_color=background_color, scale=scale, size=size, pad=pad, key=key) super().__init__(ELEM_TYPE_MENUBAR, background_color=background_color, scale=scale, size=size, pad=pad, key=key)
@ -2118,6 +2116,41 @@ def _FindElementFromKeyInSubForm(form, key):
return element return element
def AddMenuItem(top_menu, sub_menu_info, element, is_sub_menu=False, skip=False):
if type(sub_menu_info) is str:
if not is_sub_menu and not skip:
# print(f'Adding command {sub_menu_info}')
top_menu.add_command(label=sub_menu_info, command=lambda: Menu.MenuItemChosenCallback(element, sub_menu_info))
else:
i = 0
while i < (len(sub_menu_info)):
item = sub_menu_info[i]
if i != len(sub_menu_info) - 1:
if type(sub_menu_info[i+1]) == list:
new_menu = tk.Menu(top_menu)
top_menu.add_cascade(label=sub_menu_info[i], menu=new_menu)
AddMenuItem(new_menu, sub_menu_info[i+1], element, is_sub_menu=True)
i += 1 # skip the next one
else:
AddMenuItem(top_menu, item, element)
else:
AddMenuItem(top_menu, item, element)
i += 1
# print(f'Looping through {sub_menu_info}')
# print(f'Type is {type(sub_menu_info)}')
# if type(sub_menu_info[1]) is list:
# new_menu = tk.Menu(top_menu)
# top_menu.add_cascade(label=sub_menu_info[0], menu=new_menu)
# AddMenuItem(new_menu, sub_menu_info[1], element, is_sub_menu=True)
# else:
# for item in sub_menu_info:
# AddMenuItem(top_menu, item, element)
# ------------------------------------------------------------------------------------------------------------------ # # ------------------------------------------------------------------------------------------------------------------ #
# ===================================== TK CODE STARTS HERE ====================================================== # # ===================================== TK CODE STARTS HERE ====================================================== #
# ------------------------------------------------------------------------------------------------------------------ # # ------------------------------------------------------------------------------------------------------------------ #
@ -2523,13 +2556,21 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
element.TKCanvas.pack(side=tk.LEFT, padx=element.Pad[0], pady=element.Pad[1]) element.TKCanvas.pack(side=tk.LEFT, padx=element.Pad[0], pady=element.Pad[1])
# ------------------------- MENUBAR element ------------------------- # # ------------------------- MENUBAR element ------------------------- #
elif element_type == ELEM_TYPE_MENUBAR: elif element_type == ELEM_TYPE_MENUBAR:
element.TKMenu = tk.Menu(toplevel_form.TKroot) menu_def = (('File', ('Open', 'Save')),
filemenu = tk.Menu(element.TKMenu, tearoff=0) ('Help', 'About...'),)
filemenu.add_command(label="Open", command=lambda: Menu.MenuItemChosenCallback(element,'Open')) # ('Help',))
element.TKMenu.add_cascade(label="File", menu=filemenu)
helpmenu = tk.Menu(element.TKMenu) menu_def = element.MenuDefinition
element.TKMenu.add_cascade(label='Help', menu=helpmenu)
helpmenu.add('command', label='About...', command=lambda: Menu.MenuItemChosenCallback(element, 'About...')) element.TKMenu = tk.Menu(toplevel_form.TKroot, tearoff=0) # create the menubar
menubar = element.TKMenu
for menu_entry in menu_def:
# print(f'Adding a Menubar ENTRY')
baritem = tk.Menu(menubar)
menubar.add_cascade(label=menu_entry[0], menu=baritem)
if len(menu_entry) > 1:
AddMenuItem(baritem, menu_entry[1], element)
toplevel_form.TKroot.configure(menu=element.TKMenu) toplevel_form.TKroot.configure(menu=element.TKMenu)
# ------------------------- Frame element ------------------------- # # ------------------------- Frame element ------------------------- #
elif element_type == ELEM_TYPE_FRAME: elif element_type == ELEM_TYPE_FRAME: