Merge pull request #2513 from PySimpleGUI/Dev-latest

Removed f-string for 3.5 compat. Added lots of popuperrors for bad la…
This commit is contained in:
PySimpleGUI 2020-01-15 11:15:09 -05:00 committed by GitHub
commit 2e972bd6e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 164 additions and 6 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3 #!/usr/bin/python3
version = __version__ = "4.15.1.4 Unreleased - Fix for draw_pixel, fix Multline.update with no value specified, listbox update no longer selects a default, all justifications can be shortened to single letter, fix for debug window closed with Quit button" version = __version__ = "4.15.1.5 Unreleased - Fix for draw_pixel, fix Multline.update with no value specified, listbox update no longer selects a default, all justifications can be shortened to single letter, fix for debug window closed with Quit button, removed f-string"
port = 'PySimpleGUI' port = 'PySimpleGUI'
@ -165,7 +165,7 @@ def _timeit(func):
start = time.time() start = time.time()
result = func(*args, **kwargs) result = func(*args, **kwargs)
end = time.time() end = time.time()
print(f'{func.__name__} executed in {end - start:.4f} seconds') print('{} executed in {:.4f} seconds'.format( func.__name__, end - start))
return result return result
return wrapper return wrapper
@ -3648,6 +3648,37 @@ class Frame(Element):
CurrentRow = [] # start with a blank row and build up CurrentRow = [] # start with a blank row and build up
# ------------------------- Add the elements to a row ------------------------- # # ------------------------- Add the elements to a row ------------------------- #
for i, element in enumerate(args): # Loop through list of elements and add them to the row for i, element in enumerate(args): # Loop through list of elements and add them to the row
if type(element) == list:
PopupError('Error creating Frame layout',
'Layout has a LIST instead of an ELEMENT',
'This means you have a badly placed ]',
'The offensive list is:',
element,
'This list will be stripped from your layout',
keep_on_top=True
)
continue
elif callable(element) and not isinstance(element, Element):
PopupError('Error creating Frame layout',
'Layout has a FUNCTION instead of an ELEMENT',
'This likely means you are missing () from your layout',
'The offensive list is:',
element,
'This item will be stripped from your layout',
keep_on_top=True)
continue
if element.ParentContainer is not None:
warnings.warn('*** YOU ARE ATTEMPTING TO RESUSE AN ELEMENT IN YOUR LAYOUT! Once placed in a layout, an element cannot be used in another layout. ***', UserWarning)
PopupError('Error creating Frame layout',
'The layout specified has already been used',
'You MUST start witha "clean", unused layout every time you create a window',
'The offensive Element = ',
element,
'and has a key = ', element.Key,
'This item will be stripped from your layout',
'Hint - try printing your layout and matching the IDs "print(layout)"',
obj_to_string_single_obj(element), keep_on_top=True)
continue
element.Position = (CurrentRowNumber, i) element.Position = (CurrentRowNumber, i)
element.ParentContainer = self element.ParentContainer = self
CurrentRow.append(element) CurrentRow.append(element)
@ -3665,6 +3696,16 @@ class Frame(Element):
""" """
for row in rows: for row in rows:
try:
iter(row)
except TypeError:
PopupError('Error creating Frame layout',
'Your row is not an iterable (e.g. a list)',
'Instead of a list, the type found was {}'.format(type(row)),
'The offensive row = ',
row,
'This item will be stripped from your layout', keep_on_top=True)
continue
self.AddRow(*row) self.AddRow(*row)
return self return self
@ -3794,6 +3835,34 @@ class Tab(Element):
CurrentRow = [] # start with a blank row and build up CurrentRow = [] # start with a blank row and build up
# ------------------------- Add the elements to a row ------------------------- # # ------------------------- Add the elements to a row ------------------------- #
for i, element in enumerate(args): # Loop through list of elements and add them to the row for i, element in enumerate(args): # Loop through list of elements and add them to the row
if type(element) == list:
PopupError('Error creating Tab layout',
'Layout has a LIST instead of an ELEMENT',
'This means you have a badly placed ]',
'The offensive list is:',
element,
'This list will be stripped from your layout' , keep_on_top=True
)
continue
elif callable(element) and not isinstance(element, Element):
PopupError('Error creating Tab layout',
'Layout has a FUNCTION instead of an ELEMENT',
'This likely means you are missing () from your layout',
'The offensive list is:',
element,
'This item will be stripped from your layout', keep_on_top=True)
continue
if element.ParentContainer is not None:
warnings.warn('*** YOU ARE ATTEMPTING TO RESUSE AN ELEMENT IN YOUR LAYOUT! Once placed in a layout, an element cannot be used in another layout. ***', UserWarning)
PopupError('Error creating Tab layout',
'The layout specified has already been used',
'You MUST start witha "clean", unused layout every time you create a window',
'The offensive Element = ',
element,
'and has a key = ', element.Key,
'This item will be stripped from your layout',
'Hint - try printing your layout and matching the IDs "print(layout)"', keep_on_top=True)
continue
element.Position = (CurrentRowNumber, i) element.Position = (CurrentRowNumber, i)
element.ParentContainer = self element.ParentContainer = self
CurrentRow.append(element) CurrentRow.append(element)
@ -3811,9 +3880,20 @@ class Tab(Element):
""" """
for row in rows: for row in rows:
try:
iter(row)
except TypeError:
PopupError('Error creating Tab layout',
'Your row is not an iterable (e.g. a list)',
'Instead of a list, the type found was {}'.format(type(row)),
'The offensive row = ',
row,
'This item will be stripped from your layout', keep_on_top=True)
continue
self.AddRow(*row) self.AddRow(*row)
return self return self
def Update(self, disabled=None, visible=None): # TODO Disable / enable of tabs is not complete def Update(self, disabled=None, visible=None): # TODO Disable / enable of tabs is not complete
""" """
Changes some of the settings for the Tab Element. Must call `Window.Read` or `Window.Finalize` prior Changes some of the settings for the Tab Element. Must call `Window.Read` or `Window.Finalize` prior
@ -3941,6 +4021,34 @@ class TabGroup(Element):
CurrentRow = [] # start with a blank row and build up CurrentRow = [] # start with a blank row and build up
# ------------------------- Add the elements to a row ------------------------- # # ------------------------- Add the elements to a row ------------------------- #
for i, element in enumerate(args): # Loop through list of elements and add them to the row for i, element in enumerate(args): # Loop through list of elements and add them to the row
if type(element) == list:
PopupError('Error creating Tab layout',
'Layout has a LIST instead of an ELEMENT',
'This means you have a badly placed ]',
'The offensive list is:',
element,
'This list will be stripped from your layout' , keep_on_top=True
)
continue
elif callable(element) and not isinstance(element, Element):
PopupError('Error creating Tab layout',
'Layout has a FUNCTION instead of an ELEMENT',
'This likely means you are missing () from your layout',
'The offensive list is:',
element,
'This item will be stripped from your layout', keep_on_top=True)
continue
if element.ParentContainer is not None:
warnings.warn('*** YOU ARE ATTEMPTING TO RESUSE AN ELEMENT IN YOUR LAYOUT! Once placed in a layout, an element cannot be used in another layout. ***', UserWarning)
PopupError('Error creating Tab layout',
'The layout specified has already been used',
'You MUST start witha "clean", unused layout every time you create a window',
'The offensive Element = ',
element,
'and has a key = ', element.Key,
'This item will be stripped from your layout',
'Hint - try printing your layout and matching the IDs "print(layout)"', keep_on_top=True)
continue
element.Position = (CurrentRowNumber, i) element.Position = (CurrentRowNumber, i)
element.ParentContainer = self element.ParentContainer = self
CurrentRow.append(element) CurrentRow.append(element)
@ -3957,9 +4065,20 @@ class TabGroup(Element):
:return: (Frame) Used for chaining :return: (Frame) Used for chaining
""" """
for row in rows: for row in rows:
try:
iter(row)
except TypeError:
PopupError('Error creating Tab layout',
'Your row is not an iterable (e.g. a list)',
'Instead of a list, the type found was {}'.format(type(row)),
'The offensive row = ',
row,
'This item will be stripped from your layout', keep_on_top=True)
continue
self.AddRow(*row) self.AddRow(*row)
return self return self
def _GetElementAtLocation(self, location): def _GetElementAtLocation(self, location):
""" """
Not user callable. Used to find the Element at a row, col position within the layout Not user callable. Used to find the Element at a row, col position within the layout
@ -4333,6 +4452,34 @@ class Column(Element):
CurrentRow = [] # start with a blank row and build up CurrentRow = [] # start with a blank row and build up
# ------------------------- Add the elements to a row ------------------------- # # ------------------------- Add the elements to a row ------------------------- #
for i, element in enumerate(args): # Loop through list of elements and add them to the row for i, element in enumerate(args): # Loop through list of elements and add them to the row
if type(element) == list:
PopupError('Error creating Column layout',
'Layout has a LIST instead of an ELEMENT',
'This means you have a badly placed ]',
'The offensive list is:',
element,
'This list will be stripped from your layout' , keep_on_top=True
)
continue
elif callable(element) and not isinstance(element, Element):
PopupError('Error creating Column layout',
'Layout has a FUNCTION instead of an ELEMENT',
'This likely means you are missing () from your layout',
'The offensive list is:',
element,
'This item will be stripped from your layout', keep_on_top=True)
continue
if element.ParentContainer is not None:
warnings.warn('*** YOU ARE ATTEMPTING TO RESUSE AN ELEMENT IN YOUR LAYOUT! Once placed in a layout, an element cannot be used in another layout. ***', UserWarning)
PopupError('Error creating Column layout',
'The layout specified has already been used',
'You MUST start witha "clean", unused layout every time you create a window',
'The offensive Element = ',
element,
'and has a key = ', element.Key,
'This item will be stripped from your layout',
'Hint - try printing your layout and matching the IDs "print(layout)"', keep_on_top=True)
continue
element.Position = (CurrentRowNumber, i) element.Position = (CurrentRowNumber, i)
element.ParentContainer = self element.ParentContainer = self
CurrentRow.append(element) CurrentRow.append(element)
@ -4350,9 +4497,20 @@ class Column(Element):
""" """
for row in rows: for row in rows:
try:
iter(row)
except TypeError:
PopupError('Error creating Column layout',
'Your row is not an iterable (e.g. a list)',
'Instead of a list, the type found was {}'.format(type(row)),
'The offensive row = ',
row,
'This item will be stripped from your layout', keep_on_top=True)
continue
self.AddRow(*row) self.AddRow(*row)
return self return self
def _GetElementAtLocation(self, location): def _GetElementAtLocation(self, location):
""" """
Not user callable. Used to find the Element at a row, col position within the layout Not user callable. Used to find the Element at a row, col position within the layout
@ -5586,7 +5744,7 @@ class Window:
# ------------------------- Add the elements to a row ------------------------- # # ------------------------- Add the elements to a row ------------------------- #
for i, element in enumerate(args): # Loop through list of elements and add them to the row for i, element in enumerate(args): # Loop through list of elements and add them to the row
if type(element) == list: if type(element) == list:
PopupError('Error creating layout', PopupError('Error creating Window layout',
'Layout has a LIST instead of an ELEMENT', 'Layout has a LIST instead of an ELEMENT',
'This means you have a badly placed ]', 'This means you have a badly placed ]',
'The offensive list is:', 'The offensive list is:',
@ -5595,7 +5753,7 @@ class Window:
) )
continue continue
elif callable(element) and not isinstance(element, Element): elif callable(element) and not isinstance(element, Element):
PopupError('Error creating layout', PopupError('Error creating Window layout',
'Layout has a FUNCTION instead of an ELEMENT', 'Layout has a FUNCTION instead of an ELEMENT',
'This likely means you are missing () from your layout', 'This likely means you are missing () from your layout',
'The offensive list is:', 'The offensive list is:',
@ -5604,7 +5762,7 @@ class Window:
continue continue
if element.ParentContainer is not None: if element.ParentContainer is not None:
warnings.warn('*** YOU ARE ATTEMPTING TO RESUSE AN ELEMENT IN YOUR LAYOUT! Once placed in a layout, an element cannot be used in another layout. ***', UserWarning) warnings.warn('*** YOU ARE ATTEMPTING TO RESUSE AN ELEMENT IN YOUR LAYOUT! Once placed in a layout, an element cannot be used in another layout. ***', UserWarning)
PopupError('Error creating layout', PopupError('Error creating Window layout',
'The layout specified has already been used', 'The layout specified has already been used',
'You MUST start witha "clean", unused layout every time you create a window', 'You MUST start witha "clean", unused layout every time you create a window',
'The offensive Element = ', 'The offensive Element = ',
@ -5633,7 +5791,7 @@ class Window:
try: try:
iter(row) iter(row)
except TypeError: except TypeError:
PopupError('Error creating layout', PopupError('Error creating Window layout',
'Your row is not an iterable (e.g. a list)', 'Your row is not an iterable (e.g. a list)',
'Instead of a list, the type found was {}'.format(type(row)), 'Instead of a list, the type found was {}'.format(type(row)),
'The offensive row = ', 'The offensive row = ',