"user_settings" API calls! New DarkGrey14 theme
This commit is contained in:
parent
ce5310b00d
commit
01ba7cac28
215
PySimpleGUI.py
215
PySimpleGUI.py
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
version = __version__ = "4.29.0.5 Unreleased\nAdded shink parameter to pin, added variable Window.maximized, added main_sdk_help_window function, theme DarkGrey10 added, no longer setting highlight thickness to 0 for buttons so that focus can be seen, new themes DarkGrey11 DarkGrey12 DarkGrey13"
|
version = __version__ = "4.29.0.7 Unreleased\nAdded shink parameter to pin, added variable Window.maximized, added main_sdk_help_window function, theme DarkGrey10 added, no longer setting highlight thickness to 0 for buttons so that focus can be seen, new themes DarkGrey11 DarkGrey12 DarkGrey13 DarkGrey14, new user_settings APIs"
|
||||||
|
|
||||||
port = 'PySimpleGUI'
|
port = 'PySimpleGUI'
|
||||||
|
|
||||||
|
@ -133,6 +133,7 @@ except:
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
import itertools
|
import itertools
|
||||||
import os
|
import os
|
||||||
|
import json
|
||||||
import queue
|
import queue
|
||||||
try:
|
try:
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
@ -14795,6 +14796,14 @@ LOOK_AND_FEEL_TABLE = {'SystemDefault':
|
||||||
'SCROLL': '#313641',
|
'SCROLL': '#313641',
|
||||||
'BUTTON': ('#8b9fde', '#313641'),
|
'BUTTON': ('#8b9fde', '#313641'),
|
||||||
'PROGRESS': ('#cccdcf','#272a31'),
|
'PROGRESS': ('#cccdcf','#272a31'),
|
||||||
|
'BORDER': 1, 'SLIDER_DEPTH': 0, 'PROGRESS_DEPTH': 0},
|
||||||
|
'DarkGrey14' : {'BACKGROUND': '#24292e',
|
||||||
|
'TEXT': '#fafbfc',
|
||||||
|
'INPUT': '#1d2125',
|
||||||
|
'TEXT_INPUT': '#fafbfc',
|
||||||
|
'SCROLL': '#1d2125',
|
||||||
|
'BUTTON': ('#fafbfc', '#155398'),
|
||||||
|
'PROGRESS': ('#155398','#1d2125'),
|
||||||
'BORDER': 1, 'SLIDER_DEPTH': 0, 'PROGRESS_DEPTH': 0}
|
'BORDER': 1, 'SLIDER_DEPTH': 0, 'PROGRESS_DEPTH': 0}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16799,6 +16808,210 @@ def shell_with_animation(command, args=None, image_source=DEFAULT_BASE64_LOADING
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# .d8888b. 888 888 d8b
|
||||||
|
# d88P Y88b 888 888 Y8P
|
||||||
|
# Y88b. 888 888
|
||||||
|
# "Y888b. .d88b. 888888 888888 888 88888b. .d88b. .d8888b
|
||||||
|
# "Y88b. d8P Y8b 888 888 888 888 "88b d88P"88b 88K
|
||||||
|
# "888 88888888 888 888 888 888 888 888 888 "Y8888b.
|
||||||
|
# Y88b d88P Y8b. Y88b. Y88b. 888 888 888 Y88b 888 X88
|
||||||
|
# "Y8888P" "Y8888 "Y888 "Y888 888 888 888 "Y88888 88888P'
|
||||||
|
# 888
|
||||||
|
# Y8b d88P
|
||||||
|
# "Y88P"
|
||||||
|
|
||||||
|
# Interface to saving / loading user program settings in json format
|
||||||
|
|
||||||
|
class _UserSettings:
|
||||||
|
settings = None # type: _UserSettings
|
||||||
|
def __init__(self):
|
||||||
|
self.path = None
|
||||||
|
self.filename = None
|
||||||
|
self.full_filename = None
|
||||||
|
self.dict = {}
|
||||||
|
# self.full_filename = os.path.join(self.location, self.filename)
|
||||||
|
|
||||||
|
def set_location(self, filename=None, path=None):
|
||||||
|
if filename is not None:
|
||||||
|
dirname_from_filename = os.path.dirname(filename) # see if a path was provided as part of filename
|
||||||
|
if dirname_from_filename:
|
||||||
|
path = dirname_from_filename
|
||||||
|
filename = os.path.basename(filename)
|
||||||
|
else:
|
||||||
|
frame = inspect.stack()[2]
|
||||||
|
module = inspect.getmodule(frame[0])
|
||||||
|
filename = module.__file__
|
||||||
|
filename = os.path.basename(filename)
|
||||||
|
filename = os.path.splitext(filename)[0] + '.json'
|
||||||
|
self.filename = filename
|
||||||
|
|
||||||
|
if path is None:
|
||||||
|
if sys.platform.startswith('win'):
|
||||||
|
self.path = os.path.expanduser(r'~\AppData\Local\PySimpleGUI\settings')
|
||||||
|
elif sys.platform.startswith('linux'):
|
||||||
|
self.path = os.path.expanduser(r'~/.config/PySimpleGUI/settings')
|
||||||
|
elif sys.platform.startswith('darwin'):
|
||||||
|
self.path = os.path.expanduser(r'~/Library/Application Support/PySimpleGUI/settings')
|
||||||
|
else:
|
||||||
|
self.path = '.'
|
||||||
|
else:
|
||||||
|
self.path = path
|
||||||
|
self.filename = filename
|
||||||
|
self.full_filename = os.path.join(self.path, self.filename)
|
||||||
|
|
||||||
|
|
||||||
|
def save(self):
|
||||||
|
try:
|
||||||
|
if not os.path.exists(self.path):
|
||||||
|
os.makedirs(self.path)
|
||||||
|
with open(self.full_filename, 'w') as f:
|
||||||
|
json.dump(self.dict, f)
|
||||||
|
except Exception as e:
|
||||||
|
print('Error saving settings to file:', self.full_filename, e)
|
||||||
|
|
||||||
|
|
||||||
|
def read(self):
|
||||||
|
if self.full_filename is None:
|
||||||
|
return {}
|
||||||
|
try:
|
||||||
|
if os.path.exists(self.full_filename):
|
||||||
|
with open(self.full_filename, 'r') as f:
|
||||||
|
self.dict = json.load(f)
|
||||||
|
except Exception as e:
|
||||||
|
print('Error reading settings from file:', self.full_filename, e)
|
||||||
|
return self.dict
|
||||||
|
|
||||||
|
# Create a singleton for the settings information
|
||||||
|
_UserSettings.settings = _UserSettings()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def user_settings_filename(filename=None, path=None):
|
||||||
|
"""
|
||||||
|
Sets the filename and path for your settings file. Either paramter can be optional.
|
||||||
|
If you don't choose a path, one is provided for you that is OS specific
|
||||||
|
Windows path default = users/name/AppData/Local/PySimpleGUI/settings.
|
||||||
|
If you don't choose a filename, your application's filename + '.json' will be used
|
||||||
|
|
||||||
|
:param filename: The name of the file to use. Can be a full path and filename or just filename
|
||||||
|
:type filename: (str)
|
||||||
|
:param path: The folder that the settings file will be stored in. Do no include the filename.
|
||||||
|
:type path: (str)
|
||||||
|
:return: The full pathname of the settings file that has both the path and filename combined.
|
||||||
|
:rtype: (str)
|
||||||
|
"""
|
||||||
|
settings = _UserSettings.settings
|
||||||
|
if filename is not None or path is not None or (filename is None and path is None):
|
||||||
|
settings.set_location(filename, path)
|
||||||
|
settings.read()
|
||||||
|
return settings.full_filename
|
||||||
|
|
||||||
|
|
||||||
|
def user_settings_set_entry(key, value):
|
||||||
|
"""
|
||||||
|
Sets an individual setting to the specified value. If no filename has been specified up to this point,
|
||||||
|
then a default filename will be used.
|
||||||
|
After value has been modified, the settings file is written to disk.
|
||||||
|
|
||||||
|
:param key: Setting to be saved. Can be anything except a List
|
||||||
|
:type key: (Any)
|
||||||
|
:param value: Value to save as the setting's value. Can be anything
|
||||||
|
:type value: (Any)
|
||||||
|
"""
|
||||||
|
settings = _UserSettings.settings
|
||||||
|
if settings.full_filename is None:
|
||||||
|
settings.set_location()
|
||||||
|
settings.read()
|
||||||
|
settings.dict[key] = value
|
||||||
|
# settings.save()
|
||||||
|
|
||||||
|
|
||||||
|
def user_settings_get_entry(key, default=None):
|
||||||
|
"""
|
||||||
|
Returns the value of a specified setting. If the setting is not found in the settings dictionary, then
|
||||||
|
the user specified default value will be returned. It no default is specified and nothing is found,m then
|
||||||
|
None is returned.
|
||||||
|
If no filename has been specified up to this point, then a default filename will be assigned and used.
|
||||||
|
|
||||||
|
:param key: Key used to lookup the setting in the settings dictionary
|
||||||
|
:type key: (Any)
|
||||||
|
:param default: Value to use should the key not be found in the dictionary
|
||||||
|
:type default: (Any)
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
settings = _UserSettings.settings
|
||||||
|
if settings.full_filename is None:
|
||||||
|
settings.set_location()
|
||||||
|
settings.read()
|
||||||
|
value = settings.dict.get(key, default)
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def user_settings_save(filename=None, path=None):
|
||||||
|
"""
|
||||||
|
Saves the current settings dictionary. If a filename or path is specified in the call, then it will override any
|
||||||
|
previously specitfied filename to create a new settings file. The settings dictionary ais then saved to the newly defined file.
|
||||||
|
|
||||||
|
:param filename: The filename to save to. Can specify a path or just the filename. If no filename specified, then the caller's filename will be used.
|
||||||
|
:type filename: (str)
|
||||||
|
:param path: The (optional) path to use to save the file.
|
||||||
|
:type path: (str)
|
||||||
|
:return: The full path and filename used to save the settings
|
||||||
|
:rtype: (str)
|
||||||
|
"""
|
||||||
|
settings = _UserSettings.settings
|
||||||
|
if filename is not None or path is not None:
|
||||||
|
settings.set_location(filename=filename, path=path)
|
||||||
|
settings.save()
|
||||||
|
return settings.full_filename
|
||||||
|
|
||||||
|
|
||||||
|
def user_settings_load(filename=None, path=None):
|
||||||
|
"""
|
||||||
|
Specifies the path and filename to use for the settings and reads the contents of the file.
|
||||||
|
The filename can be a full filename including a path, or the path can be specified separately.
|
||||||
|
If no filename is specified, then the caller's filename will be used with the extension ".json"
|
||||||
|
|
||||||
|
:param filename: Filename to load settings from (and save to in the future)
|
||||||
|
:type filename: (str)
|
||||||
|
:param path: Path to the file. Defaults to a specific folder depending on the operating system
|
||||||
|
:type path: (str)
|
||||||
|
:return: The settings dictionary (i.e. all settings)
|
||||||
|
:rtype: (dict)
|
||||||
|
"""
|
||||||
|
settings = _UserSettings.settings
|
||||||
|
if filename is not None or path is not None or settings.full_filename is None:
|
||||||
|
settings.set_location(filename, path)
|
||||||
|
settings.read()
|
||||||
|
return settings.dict
|
||||||
|
|
||||||
|
|
||||||
|
def user_settings_write_new_dictionary(settings_dict):
|
||||||
|
"""
|
||||||
|
Writes a specified dictionary to the currently defined settings filename.
|
||||||
|
|
||||||
|
:param settings_dict: The dictionary to be written to the currently defined settings file
|
||||||
|
:type settings_dict: (dict)
|
||||||
|
"""
|
||||||
|
settings = _UserSettings.settings
|
||||||
|
if settings.full_filename is None:
|
||||||
|
settings.set_location()
|
||||||
|
settings.dict = settings_dict
|
||||||
|
settings.save()
|
||||||
|
|
||||||
|
|
||||||
|
def user_settings():
|
||||||
|
"""
|
||||||
|
Returns the current settings dictionary. You'll need to have previously read the settings file or
|
||||||
|
made an update to it so that one exists.
|
||||||
|
|
||||||
|
:return: The current settings dictionary
|
||||||
|
:rtype: (dict)
|
||||||
|
"""
|
||||||
|
return _UserSettings.settings.dict
|
||||||
|
|
||||||
|
|
||||||
#####################################################################################################
|
#####################################################################################################
|
||||||
# Debugger
|
# Debugger
|
||||||
#####################################################################################################
|
#####################################################################################################
|
||||||
|
|
Loading…
Reference in New Issue