Addition of _change_ttik_theme for better error checking. Added optional parameter to specify file in the Window.save_window_screenshot_to_disk
This commit is contained in:
parent
356a2f9c2b
commit
4d10cdadaf
|
@ -525,6 +525,7 @@ THEME_LIST = ('default', 'winnative', 'clam', 'alt', 'classic', 'vista', 'xpnati
|
||||||
|
|
||||||
# The theme to use by default for all windows
|
# The theme to use by default for all windows
|
||||||
DEFAULT_TTK_THEME = THEME_DEFAULT
|
DEFAULT_TTK_THEME = THEME_DEFAULT
|
||||||
|
ttk_theme_in_use = None
|
||||||
TTK_THEME_LIST = ('default', 'winnative', 'clam', 'alt', 'classic', 'vista', 'xpnative')
|
TTK_THEME_LIST = ('default', 'winnative', 'clam', 'alt', 'classic', 'vista', 'xpnative')
|
||||||
|
|
||||||
|
|
||||||
|
@ -4134,7 +4135,9 @@ class TKProgressBar():
|
||||||
|
|
||||||
if orientation.lower().startswith('h'):
|
if orientation.lower().startswith('h'):
|
||||||
s = ttk.Style()
|
s = ttk.Style()
|
||||||
s.theme_use(ttk_theme)
|
_change_ttk_theme(s, ttk_theme)
|
||||||
|
|
||||||
|
# s.theme_use(ttk_theme)
|
||||||
|
|
||||||
# self.style_name = str(key) + str(TKProgressBar.uniqueness_counter) + "my.Horizontal.TProgressbar"
|
# self.style_name = str(key) + str(TKProgressBar.uniqueness_counter) + "my.Horizontal.TProgressbar"
|
||||||
if BarColor != COLOR_SYSTEM_DEFAULT and BarColor[0] != COLOR_SYSTEM_DEFAULT:
|
if BarColor != COLOR_SYSTEM_DEFAULT and BarColor[0] != COLOR_SYSTEM_DEFAULT:
|
||||||
|
@ -4146,7 +4149,8 @@ class TKProgressBar():
|
||||||
self.TKProgressBarForReal = ttk.Progressbar(root, maximum=self.Max, style=self.style_name, length=length, orient=tk.HORIZONTAL, mode='determinate')
|
self.TKProgressBarForReal = ttk.Progressbar(root, maximum=self.Max, style=self.style_name, length=length, orient=tk.HORIZONTAL, mode='determinate')
|
||||||
else:
|
else:
|
||||||
s = ttk.Style()
|
s = ttk.Style()
|
||||||
s.theme_use(ttk_theme)
|
_change_ttk_theme(s, ttk_theme)
|
||||||
|
# s.theme_use(ttk_theme)
|
||||||
# self.style_name = str(key) + str(TKProgressBar.uniqueness_counter) + "my.Vertical.TProgressbar"
|
# self.style_name = str(key) + str(TKProgressBar.uniqueness_counter) + "my.Vertical.TProgressbar"
|
||||||
if BarColor != COLOR_SYSTEM_DEFAULT and BarColor[0] != COLOR_SYSTEM_DEFAULT:
|
if BarColor != COLOR_SYSTEM_DEFAULT and BarColor[0] != COLOR_SYSTEM_DEFAULT:
|
||||||
|
|
||||||
|
@ -11486,10 +11490,11 @@ class Window:
|
||||||
self.TKRightClickMenu.grab_release()
|
self.TKRightClickMenu.grab_release()
|
||||||
|
|
||||||
|
|
||||||
def save_window_screenshot_to_disk(self):
|
def save_window_screenshot_to_disk(self, filename=None):
|
||||||
"""
|
"""
|
||||||
Saves an image of the PySimpleGUI window provided into the filename provided
|
Saves an image of the PySimpleGUI window provided into the filename provided
|
||||||
|
|
||||||
|
:param filename: Optional filename to save screenshot to. If not included, the User Settinds are used to get the filename
|
||||||
:return: A PIL ImageGrab object that can be saved or manipulated
|
:return: A PIL ImageGrab object that can be saved or manipulated
|
||||||
:rtype: (PIL.ImageGrab | None)
|
:rtype: (PIL.ImageGrab | None)
|
||||||
"""
|
"""
|
||||||
|
@ -11534,10 +11539,12 @@ class Window:
|
||||||
|
|
||||||
return None
|
return None
|
||||||
# return grab
|
# return grab
|
||||||
|
if filename is None:
|
||||||
folder = pysimplegui_user_settings.get('-screenshots folder-', '')
|
folder = pysimplegui_user_settings.get('-screenshots folder-', '')
|
||||||
filename = pysimplegui_user_settings.get('-screenshots filename-', '')
|
filename = pysimplegui_user_settings.get('-screenshots filename-', '')
|
||||||
full_filename = os.path.join(folder, filename)
|
full_filename = os.path.join(folder, filename)
|
||||||
|
else:
|
||||||
|
full_filename = filename
|
||||||
if full_filename:
|
if full_filename:
|
||||||
try:
|
try:
|
||||||
grab.save(full_filename)
|
grab.save(full_filename)
|
||||||
|
@ -14280,6 +14287,19 @@ def _add_right_click_menu(element, toplevel_form):
|
||||||
element.Widget.bind('<ButtonRelease-3>', element._RightClickMenuCallback)
|
element.Widget.bind('<ButtonRelease-3>', element._RightClickMenuCallback)
|
||||||
|
|
||||||
|
|
||||||
|
def _change_ttk_theme(style, theme_name):
|
||||||
|
global ttk_theme_in_use
|
||||||
|
|
||||||
|
if theme_name in style.theme_names() and (ttk_theme_in_use != theme_name and ttk_theme_in_use is not None):
|
||||||
|
_error_popup_with_traceback('You are trying to change the TTK theme that has already been set',
|
||||||
|
'This is not a positive thing to do for your mood nor your application',
|
||||||
|
'Theme previously in use {}'.format(ttk_theme_in_use),
|
||||||
|
'New theme you are trying to set {}'.format(theme_name))
|
||||||
|
return False
|
||||||
|
style.theme_use(theme_name)
|
||||||
|
ttk_theme_in_use = theme_name
|
||||||
|
return True
|
||||||
|
|
||||||
class Stylist:
|
class Stylist:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -14408,17 +14428,20 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
def _string_width_in_pixels(font, string):
|
def _string_width_in_pixels(font, string):
|
||||||
return tkinter.font.Font(font=font).measure(string) # single character width
|
return tkinter.font.Font(font=font).measure(string) # single character width
|
||||||
|
|
||||||
def _valid_theme(style, theme_name):
|
|
||||||
if theme_name in style.theme_names():
|
|
||||||
return True
|
|
||||||
_error_popup_with_traceback('Your Window has an invalid ttk theme specified',
|
|
||||||
'The traceback will show you the Window with the problem layout',
|
|
||||||
'** Invalid ttk theme specified {} **'.format(theme_name),
|
|
||||||
'\nValid choices include: {}'.format(style.theme_names()))
|
|
||||||
|
|
||||||
# print('** Invalid ttk theme specified {} **'.format(theme_name),
|
|
||||||
|
|
||||||
|
# def _valid_theme(style, theme_name):
|
||||||
|
# if theme_name in style.theme_names():
|
||||||
|
# return True
|
||||||
|
# _error_popup_with_traceback('Your Window has an invalid ttk theme specified',
|
||||||
|
# 'The traceback will show you the Window with the problem layout',
|
||||||
|
# '** Invalid ttk theme specified {} **'.format(theme_name),
|
||||||
# '\nValid choices include: {}'.format(style.theme_names()))
|
# '\nValid choices include: {}'.format(style.theme_names()))
|
||||||
return False
|
#
|
||||||
|
# # print('** Invalid ttk theme specified {} **'.format(theme_name),
|
||||||
|
# # '\nValid choices include: {}'.format(style.theme_names()))
|
||||||
|
# return False
|
||||||
|
|
||||||
|
|
||||||
def _make_ttk_style_name(base_style, element):
|
def _make_ttk_style_name(base_style, element):
|
||||||
|
@ -14439,7 +14462,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
style = ttk.Style()
|
style = ttk.Style()
|
||||||
style.theme_use(toplevel_form.TtkTheme)
|
_change_ttk_theme(style, toplevel_form.TtkTheme)
|
||||||
|
# style.theme_use(toplevel_form.TtkTheme)
|
||||||
if orientation[0].lower() == 'v':
|
if orientation[0].lower() == 'v':
|
||||||
orient = 'vertical'
|
orient = 'vertical'
|
||||||
style_name = _make_ttk_style_name('.Vertical.TScrollbar', element)
|
style_name = _make_ttk_style_name('.Vertical.TScrollbar', element)
|
||||||
|
@ -14997,8 +15021,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
# style_name = str(Window._counter_for_ttk_widgets) + (element.Key) + 'custombutton.TButton'
|
# style_name = str(Window._counter_for_ttk_widgets) + (element.Key) + 'custombutton.TButton'
|
||||||
style_name = _make_ttk_style_name('.custombutton.TButton', element)
|
style_name = _make_ttk_style_name('.custombutton.TButton', element)
|
||||||
button_style = ttk.Style()
|
button_style = ttk.Style()
|
||||||
if _valid_theme(button_style, toplevel_form.TtkTheme):
|
_change_ttk_theme(button_style, toplevel_form.TtkTheme)
|
||||||
button_style.theme_use(toplevel_form.TtkTheme)
|
|
||||||
button_style.configure(style_name, font=font)
|
button_style.configure(style_name, font=font)
|
||||||
|
|
||||||
if bc != (None, None) and COLOR_SYSTEM_DEFAULT not in bc:
|
if bc != (None, None) and COLOR_SYSTEM_DEFAULT not in bc:
|
||||||
|
@ -15235,8 +15258,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
|
|
||||||
combostyle = ttk.Style()
|
combostyle = ttk.Style()
|
||||||
element.ttk_style = combostyle
|
element.ttk_style = combostyle
|
||||||
if _valid_theme(combostyle, toplevel_form.TtkTheme):
|
_change_ttk_theme(combostyle, toplevel_form.TtkTheme)
|
||||||
combostyle.theme_use(toplevel_form.TtkTheme)
|
|
||||||
|
|
||||||
# Creates a unique name for each field element(Sure there is a better way to do this)
|
# Creates a unique name for each field element(Sure there is a better way to do this)
|
||||||
unique_field = _make_ttk_style_name('.TCombobox.field', element)
|
unique_field = _make_ttk_style_name('.TCombobox.field', element)
|
||||||
|
@ -15930,7 +15952,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
# custom_style = str(element.Key) + 'customtab.TNotebook'
|
# custom_style = str(element.Key) + 'customtab.TNotebook'
|
||||||
custom_style = _make_ttk_style_name('.customtab.TNotebook', element)
|
custom_style = _make_ttk_style_name('.customtab.TNotebook', element)
|
||||||
style = ttk.Style()
|
style = ttk.Style()
|
||||||
style.theme_use(toplevel_form.TtkTheme)
|
_change_ttk_theme(style, toplevel_form.TtkTheme)
|
||||||
|
# style.theme_use(toplevel_form.TtkTheme)
|
||||||
if element.TabLocation is not None:
|
if element.TabLocation is not None:
|
||||||
position_dict = {'left': 'w', 'right': 'e', 'top': 'n', 'bottom': 's', 'lefttop': 'wn',
|
position_dict = {'left': 'w', 'right': 'e', 'top': 'n', 'bottom': 's', 'lefttop': 'wn',
|
||||||
'leftbottom': 'ws', 'righttop': 'en', 'rightbottom': 'es', 'bottomleft': 'sw',
|
'leftbottom': 'ws', 'righttop': 'en', 'rightbottom': 'es', 'bottomleft': 'sw',
|
||||||
|
@ -16110,7 +16133,9 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
table_style = ttk.Style()
|
table_style = ttk.Style()
|
||||||
element.ttk_style = table_style
|
element.ttk_style = table_style
|
||||||
|
|
||||||
table_style.theme_use(toplevel_form.TtkTheme)
|
# table_style.theme_use(toplevel_form.TtkTheme)
|
||||||
|
_change_ttk_theme(table_style, toplevel_form.TtkTheme)
|
||||||
|
|
||||||
if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT:
|
if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT:
|
||||||
table_style.configure(style_name, background=element.BackgroundColor, fieldbackground=element.BackgroundColor, )
|
table_style.configure(style_name, background=element.BackgroundColor, fieldbackground=element.BackgroundColor, )
|
||||||
if element.SelectedRowColors[1] is not None:
|
if element.SelectedRowColors[1] is not None:
|
||||||
|
@ -16297,7 +16322,9 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
# style_name = str(element.Key) + '.Treeview'
|
# style_name = str(element.Key) + '.Treeview'
|
||||||
style_name = _make_ttk_style_name('.Treeview', element)
|
style_name = _make_ttk_style_name('.Treeview', element)
|
||||||
tree_style = ttk.Style()
|
tree_style = ttk.Style()
|
||||||
tree_style.theme_use(toplevel_form.TtkTheme)
|
# tree_style.theme_use(toplevel_form.TtkTheme)
|
||||||
|
_change_ttk_theme(tree_style, toplevel_form.TtkTheme)
|
||||||
|
|
||||||
if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT:
|
if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT:
|
||||||
tree_style.configure(style_name, background=element.BackgroundColor, fieldbackground=element.BackgroundColor)
|
tree_style.configure(style_name, background=element.BackgroundColor, fieldbackground=element.BackgroundColor)
|
||||||
if element.SelectedRowColors[1] is not None:
|
if element.SelectedRowColors[1] is not None:
|
||||||
|
@ -16395,7 +16422,9 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
# style_name = str(element.Key) + "Line.TSeparator"
|
# style_name = str(element.Key) + "Line.TSeparator"
|
||||||
style_name = _make_ttk_style_name(".Line.TSeparator", element)
|
style_name = _make_ttk_style_name(".Line.TSeparator", element)
|
||||||
style = ttk.Style()
|
style = ttk.Style()
|
||||||
style.theme_use(toplevel_form.TtkTheme)
|
# style.theme_use(toplevel_form.TtkTheme)
|
||||||
|
_change_ttk_theme(style, toplevel_form.TtkTheme)
|
||||||
|
|
||||||
if element.color is not None:
|
if element.color is not None:
|
||||||
style.configure(style_name, background=element.color)
|
style.configure(style_name, background=element.color)
|
||||||
separator = element.Widget = ttk.Separator(tk_row_frame, orient=element.Orientation, )
|
separator = element.Widget = ttk.Separator(tk_row_frame, orient=element.Orientation, )
|
||||||
|
@ -16412,7 +16441,9 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
|
||||||
element = element # type: Sizegrip
|
element = element # type: Sizegrip
|
||||||
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)
|
||||||
|
_change_ttk_theme(style, toplevel_form.TtkTheme)
|
||||||
|
|
||||||
size_grip = element.Widget = ttk.Sizegrip(tk_row_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
|
||||||
|
@ -24136,11 +24167,13 @@ def _create_main_window():
|
||||||
|
|
||||||
frame5 = [[
|
frame5 = [[
|
||||||
Table(values=matrix, headings=matrix[0],
|
Table(values=matrix, headings=matrix[0],
|
||||||
auto_size_columns=False, display_row_numbers=True, change_submits=False, justification='right', header_border_width=4, header_relief=RELIEF_GROOVE,
|
auto_size_columns=False, display_row_numbers=True, change_submits=False, justification='right', header_border_width=4,
|
||||||
|
# header_relief=RELIEF_GROOVE,
|
||||||
num_rows=10, alternating_row_color='lightblue', key='-TABLE-',
|
num_rows=10, alternating_row_color='lightblue', key='-TABLE-',
|
||||||
col_widths=[5, 5, 5, 5], size=(400, 200)),
|
col_widths=[5, 5, 5, 5], size=(400, 200)),
|
||||||
T(' '),
|
T(' '),
|
||||||
Tree(data=treedata, headings=['col1', 'col2', 'col3'], change_submits=True, auto_size_columns=True, header_border_width=4, header_relief=RELIEF_GROOVE,
|
Tree(data=treedata, headings=['col1', 'col2', 'col3'], change_submits=True, auto_size_columns=True, header_border_width=4,
|
||||||
|
# header_relief=RELIEF_GROOVE,
|
||||||
num_rows=10, col0_width=10, key='-TREE-', show_expanded=True )],[VStretch()]]
|
num_rows=10, col0_width=10, key='-TREE-', show_expanded=True )],[VStretch()]]
|
||||||
frame7 = [[Image(EMOJI_BASE64_HAPPY_HEARTS, enable_events=True, k='-EMOJI-HEARTS-'), T('Do you'), Image(HEART_3D_BASE64, subsample=3, enable_events=True, k='-HEART-'), T('so far?')],
|
frame7 = [[Image(EMOJI_BASE64_HAPPY_HEARTS, enable_events=True, k='-EMOJI-HEARTS-'), T('Do you'), Image(HEART_3D_BASE64, subsample=3, enable_events=True, k='-HEART-'), T('so far?')],
|
||||||
[T('Want to be taught PySimpleGUI? Then maybe the "Official PySimpleGUI Course" on Udemy is for you.')],
|
[T('Want to be taught PySimpleGUI? Then maybe the "Official PySimpleGUI Course" on Udemy is for you.')],
|
||||||
|
@ -24234,7 +24267,7 @@ def _create_main_window():
|
||||||
# grab_anywhere=True,
|
# grab_anywhere=True,
|
||||||
enable_close_attempted_event=True,
|
enable_close_attempted_event=True,
|
||||||
modal=False,
|
modal=False,
|
||||||
# ttk_theme=THEME_ALT,
|
ttk_theme='alt'
|
||||||
# icon=PSG_DEBUGGER_LOGO,
|
# icon=PSG_DEBUGGER_LOGO,
|
||||||
# icon=PSGDebugLogo,
|
# icon=PSGDebugLogo,
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue