Merge pull request #4388 from PySimpleGUI/Dev-latest
font settings - Multiline update & print, cprint, debug print. CLIPB…
This commit is contained in:
commit
65c13b010c
105
PySimpleGUI.py
105
PySimpleGUI.py
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
version = __version__ = "4.43.0.6.1 Unreleased\nChanged get_versions string to be more clear, removed canvas from return values, cwd is automatically set to the folder of the application being launched when execute_py_file is called with cwd=None, popup_get_file changed to set parent=None if running on Mac, better Button error handling when bad Unicode chars are used or bad colors, open GitHub issue GUI - added collapse button to top section, see-through mode in test harness changed to be a toggle, Listbox visibility fix"
|
version = __version__ = "4.43.0.8 Unreleased\nChanged get_versions string to be more clear, removed canvas from return values, cwd is automatically set to the folder of the application being launched when execute_py_file is called with cwd=None, popup_get_file changed to set parent=None if running on Mac, better Button error handling when bad Unicode chars are used or bad colors, open GitHub issue GUI - added collapse button to top section, see-through mode in test harness changed to be a toggle, font parm for multiline update print cprint for char by char font control, clipboard_set & clipboard_get, Listbox visibility fix"
|
||||||
|
|
||||||
__version__ = version.split()[0] # For PEP 396 and PEP 345
|
__version__ = version.split()[0] # For PEP 396 and PEP 345
|
||||||
|
|
||||||
|
@ -500,6 +500,7 @@ WRITE_ONLY_KEY = '__WRITE ONLY__'
|
||||||
MENU_DISABLED_CHARACTER = '!'
|
MENU_DISABLED_CHARACTER = '!'
|
||||||
MENU_SHORTCUT_CHARACTER = '&'
|
MENU_SHORTCUT_CHARACTER = '&'
|
||||||
MENU_KEY_SEPARATOR = '::'
|
MENU_KEY_SEPARATOR = '::'
|
||||||
|
MENU_SEPARATOR_LINE = '---'
|
||||||
MENU_RIGHT_CLICK_EDITME_EXIT = ['', ['Edit Me', 'Exit']]
|
MENU_RIGHT_CLICK_EDITME_EXIT = ['', ['Edit Me', 'Exit']]
|
||||||
MENU_RIGHT_CLICK_EDITME_VER_EXIT = ['', ['Edit Me', 'Version', 'Exit']]
|
MENU_RIGHT_CLICK_EDITME_VER_EXIT = ['', ['Edit Me', 'Version', 'Exit']]
|
||||||
MENU_RIGHT_CLICK_EDITME_VER_SETTINGS_EXIT = ['', ['Edit Me', 'Settings', 'Version', 'Exit']]
|
MENU_RIGHT_CLICK_EDITME_VER_SETTINGS_EXIT = ['', ['Edit Me', 'Settings', 'Version', 'Exit']]
|
||||||
|
@ -2711,7 +2712,7 @@ class Multiline(Element):
|
||||||
text_color=fg, key=key, pad=pad, tooltip=tooltip, font=font or DEFAULT_FONT, visible=visible, metadata=metadata)
|
text_color=fg, key=key, pad=pad, tooltip=tooltip, font=font or DEFAULT_FONT, visible=visible, metadata=metadata)
|
||||||
return
|
return
|
||||||
|
|
||||||
def update(self, value=None, disabled=None, append=False, font=None, text_color=None, background_color=None, text_color_for_value=None, background_color_for_value=None, visible=None, autoscroll=None, justification=None):
|
def update(self, value=None, disabled=None, append=False, font=None, text_color=None, background_color=None, text_color_for_value=None, background_color_for_value=None, visible=None, autoscroll=None, justification=None, font_for_value=None):
|
||||||
"""
|
"""
|
||||||
Changes some of the settings for the Multiline Element. Must call `Window.Read` or `Window.Finalize` prior
|
Changes some of the settings for the Multiline Element. Must call `Window.Read` or `Window.Finalize` prior
|
||||||
:param value: new text to display
|
:param value: new text to display
|
||||||
|
@ -2720,7 +2721,7 @@ class Multiline(Element):
|
||||||
:type disabled: (bool)
|
:type disabled: (bool)
|
||||||
:param append: if True then new value will be added onto the end of the current value. if False then contents will be replaced.
|
:param append: if True then new value will be added onto the end of the current value. if False then contents will be replaced.
|
||||||
:type append: (bool)
|
:type append: (bool)
|
||||||
:param font: specifies the font family, size, etc
|
:param font: specifies the font family, size, etc for the entire element
|
||||||
:type font: str | (str, int)
|
:type font: str | (str, int)
|
||||||
:param text_color: color of the text
|
:param text_color: color of the text
|
||||||
:type text_color: (str)
|
:type text_color: (str)
|
||||||
|
@ -2736,6 +2737,8 @@ class Multiline(Element):
|
||||||
:type autoscroll: (bool)
|
:type autoscroll: (bool)
|
||||||
:param justification: text justification. left, right, center. Can use single characters l, r, c. Sets only for this value, not entire element
|
:param justification: text justification. left, right, center. Can use single characters l, r, c. Sets only for this value, not entire element
|
||||||
:type justification: (str)
|
:type justification: (str)
|
||||||
|
:param font_for_value: specifies the font family, size, etc for the value being updated
|
||||||
|
:type font_for_value: str | (str, int)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not self._widget_was_created(): # if widget hasn't been created yet, then don't allow
|
if not self._widget_was_created(): # if widget hasn't been created yet, then don't allow
|
||||||
|
@ -2758,15 +2761,17 @@ class Multiline(Element):
|
||||||
tag = None
|
tag = None
|
||||||
if value is not None:
|
if value is not None:
|
||||||
value = str(value)
|
value = str(value)
|
||||||
if background_color_for_value is not None or text_color_for_value is not None:
|
if background_color_for_value is not None or text_color_for_value is not None or font_for_value is not None:
|
||||||
try:
|
try:
|
||||||
tag = 'Multiline(' + str(text_color_for_value) + ','+ str(background_color_for_value)+')'
|
tag = 'Multiline(' + str(text_color_for_value) + ','+ str(background_color_for_value)+ str(font_for_value) + ')'
|
||||||
if tag not in self.tags:
|
if tag not in self.tags:
|
||||||
self.tags.add(tag)
|
self.tags.add(tag)
|
||||||
if background_color_for_value is not None:
|
if background_color_for_value is not None:
|
||||||
self.TKText.tag_configure(tag, background=background_color_for_value)
|
self.TKText.tag_configure(tag, background=background_color_for_value)
|
||||||
if text_color_for_value is not None:
|
if text_color_for_value is not None:
|
||||||
self.TKText.tag_configure(tag, foreground=text_color_for_value)
|
self.TKText.tag_configure(tag, foreground=text_color_for_value)
|
||||||
|
if font_for_value is not None:
|
||||||
|
self.TKText.tag_configure(tag, font=font_for_value)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print('* Multiline.update - bad color likely specified:', e)
|
print('* Multiline.update - bad color likely specified:', e)
|
||||||
if self.Disabled:
|
if self.Disabled:
|
||||||
|
@ -2826,7 +2831,7 @@ class Multiline(Element):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def print(self, *args, end=None, sep=None, text_color=None, background_color=None, justification=None,colors=None, t=None, b=None, c=None):
|
def print(self, *args, end=None, sep=None, text_color=None, background_color=None, justification=None, font=None, colors=None, t=None, b=None, c=None):
|
||||||
"""
|
"""
|
||||||
Print like Python normally prints except route the output to a multiline element and also add colors if desired
|
Print like Python normally prints except route the output to a multiline element and also add colors if desired
|
||||||
|
|
||||||
|
@ -2856,6 +2861,8 @@ class Multiline(Element):
|
||||||
:type background_color: (str)
|
:type background_color: (str)
|
||||||
:param justification: text justification. left, right, center. Can use single characters l, r, c. Sets only for this value, not entire element
|
:param justification: text justification. left, right, center. Can use single characters l, r, c. Sets only for this value, not entire element
|
||||||
:type justification: (str)
|
:type justification: (str)
|
||||||
|
:param font: specifies the font family, size, etc for the args being printed
|
||||||
|
:type font: str | (str, int) | (str, int, str)
|
||||||
:param colors: Either a tuple or a string that has both the text and background colors
|
:param colors: Either a tuple or a string that has both the text and background colors
|
||||||
:type colors: (str) or (str, str)
|
:type colors: (str) or (str, str)
|
||||||
:param t: Color of the text
|
:param t: Color of the text
|
||||||
|
@ -2880,7 +2887,7 @@ class Multiline(Element):
|
||||||
print('* cprint warning * you messed up with color formatting', e)
|
print('* cprint warning * you messed up with color formatting', e)
|
||||||
|
|
||||||
|
|
||||||
_print_to_element(self, *args, end=end, sep=sep, text_color=kw_text_color, background_color=kw_background_color, justification=justification, autoscroll=True )
|
_print_to_element(self, *args, end=end, sep=sep, text_color=kw_text_color, background_color=kw_background_color, justification=justification, autoscroll=True, font=font )
|
||||||
|
|
||||||
|
|
||||||
def reroute_stdout_to_here(self):
|
def reroute_stdout_to_here(self):
|
||||||
|
@ -13946,7 +13953,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
style_name = "Sizegrip.TSizegrip"
|
style_name = "Sizegrip.TSizegrip"
|
||||||
style = ttk.Style()
|
style = ttk.Style()
|
||||||
style.theme_use(toplevel_form.TtkTheme)
|
style.theme_use(toplevel_form.TtkTheme)
|
||||||
size_grip = element.Widget = ttk.Sizegrip(containing_frame)
|
size_grip = element.Widget = ttk.Sizegrip(tk_row_frame)
|
||||||
toplevel_form.sizegrip_widget = size_grip
|
toplevel_form.sizegrip_widget = size_grip
|
||||||
# if no size is specified, then use the background color for the window
|
# if no size is specified, then use the background color for the window
|
||||||
if element.BackgroundColor != COLOR_SYSTEM_DEFAULT:
|
if element.BackgroundColor != COLOR_SYSTEM_DEFAULT:
|
||||||
|
@ -13954,6 +13961,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
else:
|
else:
|
||||||
style.configure(style_name, background=toplevel_form.TKroot['bg'])
|
style.configure(style_name, background=toplevel_form.TKroot['bg'])
|
||||||
size_grip.configure(style=style_name)
|
size_grip.configure(style=style_name)
|
||||||
|
size_grip.pack(side=tk.RIGHT, anchor='se', padx=0, pady=0, fill=tk.X)
|
||||||
|
size_grip = None
|
||||||
# normally the widget would be packed here, but for the sizegrip, the pack happens after the window is created
|
# normally the widget would be packed here, but for the sizegrip, the pack happens after the window is created
|
||||||
# ------------------------- StatusBar placement element ------------------------- #
|
# ------------------------- StatusBar placement element ------------------------- #
|
||||||
elif element_type == ELEM_TYPE_STATUSBAR:
|
elif element_type == ELEM_TYPE_STATUSBAR:
|
||||||
|
@ -14618,7 +14627,7 @@ class _DebugWin():
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def Print(self, *args, end=None, sep=None, text_color=None, background_color=None, erase_all=False):
|
def Print(self, *args, end=None, sep=None, text_color=None, background_color=None, erase_all=False, font=None):
|
||||||
sepchar = sep if sep is not None else ' '
|
sepchar = sep if sep is not None else ' '
|
||||||
endchar = end if end is not None else '\n'
|
endchar = end if end is not None else '\n'
|
||||||
|
|
||||||
|
@ -14648,7 +14657,7 @@ class _DebugWin():
|
||||||
outstring += sep_str
|
outstring += sep_str
|
||||||
outstring += end_str
|
outstring += end_str
|
||||||
|
|
||||||
self.output_element.Update(outstring, append=True, text_color_for_value=text_color, background_color_for_value=background_color)
|
self.output_element.Update(outstring, append=True, text_color_for_value=text_color, background_color_for_value=background_color, font_for_value=font)
|
||||||
else:
|
else:
|
||||||
print(*args, sep=sepchar, end=endchar)
|
print(*args, sep=sepchar, end=endchar)
|
||||||
|
|
||||||
|
@ -14770,7 +14779,7 @@ def cprint_set_output_destination(window, multiline_key):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def cprint(*args, end=None, sep=' ', text_color=None, t=None, background_color=None, b=None, colors=None, c=None, window=None, key=None, justification=None):
|
def cprint(*args, end=None, sep=' ', text_color=None, font=None, t=None, background_color=None, b=None, colors=None, c=None, window=None, key=None, justification=None):
|
||||||
"""
|
"""
|
||||||
Color print to a multiline element in a window of your choice.
|
Color print to a multiline element in a window of your choice.
|
||||||
Must have EITHER called cprint_set_output_destination prior to making this call so that the
|
Must have EITHER called cprint_set_output_destination prior to making this call so that the
|
||||||
|
@ -14803,6 +14812,8 @@ def cprint(*args, end=None, sep=' ', text_color=None, t=None, background_color=N
|
||||||
:type *args: (Any)
|
:type *args: (Any)
|
||||||
:param text_color: Color of the text
|
:param text_color: Color of the text
|
||||||
:type text_color: (str)
|
:type text_color: (str)
|
||||||
|
:param font: specifies the font family, size, etc for the value being updated
|
||||||
|
:type font: str | (str, int) | (str, int, str)
|
||||||
:param background_color: The background color of the line
|
:param background_color: The background color of the line
|
||||||
:type background_color: (str)
|
:type background_color: (str)
|
||||||
:param colors: Either a tuple or a string that has both the text and background colors
|
:param colors: Either a tuple or a string that has both the text and background colors
|
||||||
|
@ -14854,10 +14865,10 @@ def cprint(*args, end=None, sep=' ', text_color=None, t=None, background_color=N
|
||||||
try:
|
try:
|
||||||
# mline = destination_window[destination_key] # type: Multiline
|
# mline = destination_window[destination_key] # type: Multiline
|
||||||
if end is None:
|
if end is None:
|
||||||
mline.print(*args, text_color=kw_text_color, background_color=kw_background_color, end='', sep=sep, justification=justification)
|
mline.print(*args, text_color=kw_text_color, background_color=kw_background_color, end='', sep=sep, justification=justification, font=font)
|
||||||
mline.print('', justification=justification)
|
mline.print('', justification=justification)
|
||||||
else:
|
else:
|
||||||
mline.print(*args,text_color=kw_text_color, background_color=kw_background_color, end=end, sep=sep, justification=justification)
|
mline.print(*args,text_color=kw_text_color, background_color=kw_background_color, end=end, sep=sep, justification=justification, font=font)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print('** cprint error trying to print to the multiline. Printing to console instead **', e)
|
print('** cprint error trying to print to the multiline. Printing to console instead **', e)
|
||||||
print(*args, end=end, sep=sep)
|
print(*args, end=end, sep=sep)
|
||||||
|
@ -14867,7 +14878,7 @@ def cprint(*args, end=None, sep=' ', text_color=None, t=None, background_color=N
|
||||||
# A print-like call that can be used to output to a multiline element as if it's an Output element #
|
# A print-like call that can be used to output to a multiline element as if it's an Output element #
|
||||||
# ------------------------------------------------------------------------------------------------ #
|
# ------------------------------------------------------------------------------------------------ #
|
||||||
|
|
||||||
def _print_to_element(multiline_element, *args, end=None, sep=None, text_color=None, background_color=None, autoscroll=None, justification=None):
|
def _print_to_element(multiline_element, *args, end=None, sep=None, text_color=None, background_color=None, autoscroll=None, justification=None, font=None):
|
||||||
"""
|
"""
|
||||||
Print like Python normally prints except route the output to a multiline element and also add colors if desired
|
Print like Python normally prints except route the output to a multiline element and also add colors if desired
|
||||||
|
|
||||||
|
@ -14885,6 +14896,8 @@ def _print_to_element(multiline_element, *args, end=None, sep=None, text_color=N
|
||||||
:type background_color: (str)
|
:type background_color: (str)
|
||||||
:param autoscroll: If True (the default), the element will scroll to bottom after updating
|
:param autoscroll: If True (the default), the element will scroll to bottom after updating
|
||||||
:type autoscroll: (bool)
|
:type autoscroll: (bool)
|
||||||
|
:param font: specifies the font family, size, etc for the value being updated
|
||||||
|
:type font: str | (str, int)
|
||||||
"""
|
"""
|
||||||
end_str = str(end) if end is not None else '\n'
|
end_str = str(end) if end is not None else '\n'
|
||||||
sep_str = str(sep) if sep is not None else ' '
|
sep_str = str(sep) if sep is not None else ' '
|
||||||
|
@ -14897,7 +14910,7 @@ def _print_to_element(multiline_element, *args, end=None, sep=None, text_color=N
|
||||||
outstring += sep_str
|
outstring += sep_str
|
||||||
outstring += end_str
|
outstring += end_str
|
||||||
|
|
||||||
multiline_element.update(outstring, append=True, text_color_for_value=text_color, background_color_for_value=background_color, autoscroll=autoscroll, justification=justification)
|
multiline_element.update(outstring, append=True, text_color_for_value=text_color, background_color_for_value=background_color, autoscroll=autoscroll, justification=justification, font_for_value=font)
|
||||||
|
|
||||||
try: # if the element is set to autorefresh, then refresh the parent window
|
try: # if the element is set to autorefresh, then refresh the parent window
|
||||||
if multiline_element.AutoRefresh:
|
if multiline_element.AutoRefresh:
|
||||||
|
@ -16019,6 +16032,63 @@ def obj_to_string(obj, extra=' '):
|
||||||
for item in sorted(obj.__dict__)))
|
for item in sorted(obj.__dict__)))
|
||||||
|
|
||||||
|
|
||||||
|
#...######..##.......####.########..########...#######.....###....########..########.
|
||||||
|
#..##....##.##........##..##.....##.##.....##.##.....##...##.##...##.....##.##.....##
|
||||||
|
#..##.......##........##..##.....##.##.....##.##.....##..##...##..##.....##.##.....##
|
||||||
|
#..##.......##........##..########..########..##.....##.##.....##.########..##.....##
|
||||||
|
#..##.......##........##..##........##.....##.##.....##.#########.##...##...##.....##
|
||||||
|
#..##....##.##........##..##........##.....##.##.....##.##.....##.##....##..##.....##
|
||||||
|
#...######..########.####.##........########...#######..##.....##.##.....##.########.
|
||||||
|
#................................................................................
|
||||||
|
#..########.##.....##.##....##..######..########.####..#######..##....##..######.
|
||||||
|
#..##.......##.....##.###...##.##....##....##.....##..##.....##.###...##.##....##
|
||||||
|
#..##.......##.....##.####..##.##..........##.....##..##.....##.####..##.##......
|
||||||
|
#..######...##.....##.##.##.##.##..........##.....##..##.....##.##.##.##..######.
|
||||||
|
#..##.......##.....##.##..####.##..........##.....##..##.....##.##..####.......##
|
||||||
|
#..##.......##.....##.##...###.##....##....##.....##..##.....##.##...###.##....##
|
||||||
|
#..##........#######..##....##..######.....##....####..#######..##....##..######.
|
||||||
|
|
||||||
|
def clipboard_set(new_value):
|
||||||
|
"""
|
||||||
|
Sets the clipboard to a specific value
|
||||||
|
:param new_value:
|
||||||
|
:type new_value: (str)
|
||||||
|
"""
|
||||||
|
# Create and use a temp window
|
||||||
|
root = tk.Tk()
|
||||||
|
root.withdraw()
|
||||||
|
root.clipboard_clear()
|
||||||
|
root.clipboard_append(new_value)
|
||||||
|
root.update()
|
||||||
|
root.destroy()
|
||||||
|
|
||||||
|
|
||||||
|
def clipboard_get():
|
||||||
|
"""
|
||||||
|
Gets the clipboard current value
|
||||||
|
:return: The current value of the clipboard
|
||||||
|
:rtype: (str)
|
||||||
|
"""
|
||||||
|
# Create and use a temp window
|
||||||
|
root = tk.Tk()
|
||||||
|
root.withdraw()
|
||||||
|
try:
|
||||||
|
value = root.clipboard_get()
|
||||||
|
except:
|
||||||
|
value = ''
|
||||||
|
root.update()
|
||||||
|
root.destroy()
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# MM"""""""`YM
|
# MM"""""""`YM
|
||||||
# MM mmmmm M
|
# MM mmmmm M
|
||||||
# M' .M .d8888b. 88d888b. dP dP 88d888b. .d8888b.
|
# M' .M .d8888b. 88d888b. dP dP 88d888b. .d8888b.
|
||||||
|
@ -19980,11 +20050,12 @@ def main_get_debug_data(suppress_popup=False):
|
||||||
root.withdraw()
|
root.withdraw()
|
||||||
root.clipboard_clear()
|
root.clipboard_clear()
|
||||||
root.clipboard_append(message)
|
root.clipboard_append(message)
|
||||||
root.update_idletasks()
|
# root.update_idletasks()
|
||||||
|
root.update()
|
||||||
root.destroy()
|
root.destroy()
|
||||||
|
|
||||||
if not suppress_popup:
|
if not suppress_popup:
|
||||||
popup_scrolled('*** With this window still open, paste clipboard into your GitHub Issue***\n',
|
popup_scrolled('*** Version information copied to your clipboard. Paste into your GitHub Issue. ***\n',
|
||||||
message, title='Select and copy this info to your GitHub Issue', keep_on_top=True, size=(100,10))
|
message, title='Select and copy this info to your GitHub Issue', keep_on_top=True, size=(100,10))
|
||||||
|
|
||||||
return message
|
return message
|
||||||
|
|
Loading…
Reference in New Issue