Initial settings demo program check-in
This commit is contained in:
parent
3f4734c102
commit
08387b91e3
|
@ -0,0 +1,98 @@
|
|||
import PySimpleGUI as sg
|
||||
from json import (load as jsonload, dump as jsondump)
|
||||
from os import path
|
||||
|
||||
"""
|
||||
A simple "settings" implementation. Load/Edit/Save settings for your programs
|
||||
Uses json file format which makes it trivial to integrate into a Python program. If you can
|
||||
put your data into a dictionary, you can save it as a settings file.
|
||||
|
||||
Note that it attempts to use a lookup dictionary to convert from the settings file to keys used in
|
||||
your settings window. Some element's "update" methods may not work correctly for some elements.
|
||||
|
||||
Copyright 2020 PySimpleGUI.com
|
||||
Licensed under LGPL-3
|
||||
"""
|
||||
|
||||
SETTINGS_FILE = path.join(path.dirname(__file__), r'settings_file.cfg')
|
||||
DEFAULT_SETTINGS = {'max_users': 10, 'user_data_folder': None , 'theme': sg.theme(), 'zipcode' : '94102'}
|
||||
# "Map" from the settings dictionary keys to the window's element keys
|
||||
SETTINGS_KEYS_TO_ELEMENT_KEYS = {'max_users': '-MAX USERS-', 'user_data_folder': '-USER FOLDER-' , 'theme': '-THEME-', 'zipcode' : '-ZIPCODE-'}
|
||||
|
||||
########################################## Load/Save Settings File ##########################################
|
||||
def load_settings(settings_file, default_settings):
|
||||
try:
|
||||
with open(settings_file, 'r') as f:
|
||||
settings = jsonload(f)
|
||||
except Exception as e:
|
||||
sg.popup_quick_message(f'exception {e}', 'No settings file found... will create one for you', keep_on_top=True, background_color='red', text_color='white')
|
||||
settings = default_settings
|
||||
save_settings(settings_file, settings, None)
|
||||
return settings
|
||||
|
||||
|
||||
def save_settings(settings_file, settings, values):
|
||||
if values: # if there are stuff specified by another window, fill in those values
|
||||
for key in SETTINGS_KEYS_TO_ELEMENT_KEYS: # update window with the values read from settings file
|
||||
try:
|
||||
settings[key] = values[SETTINGS_KEYS_TO_ELEMENT_KEYS[key]]
|
||||
except Exception as e:
|
||||
print(f'Problem updating settings from window values. Key = {key}')
|
||||
|
||||
with open(settings_file, 'w') as f:
|
||||
jsondump(settings, f)
|
||||
|
||||
sg.popup('Settings saved')
|
||||
|
||||
########################################## Make a settings window ##########################################
|
||||
def create_settings_window(settings):
|
||||
sg.theme(settings['theme'])
|
||||
|
||||
def TextLabel(text): return sg.Text(text+':', justification='r', size=(15,1))
|
||||
|
||||
layout = [ [sg.Text('Settings', font='Any 15')],
|
||||
[TextLabel('Max Users'), sg.Input(key='-MAX USERS-')],
|
||||
[TextLabel('User Folder'),sg.Input(key='-USER FOLDER-'), sg.FolderBrowse(target='-USER FOLDER-')],
|
||||
[TextLabel('Zipcode'),sg.Input(key='-ZIPCODE-')],
|
||||
[TextLabel('Theme'),sg.Combo(sg.theme_list(), size=(20, 20), key='-THEME-')],
|
||||
[sg.Button('Save'), sg.Button('Exit')] ]
|
||||
|
||||
window = sg.Window('Settings', layout, keep_on_top=True, finalize=True)
|
||||
|
||||
for key in SETTINGS_KEYS_TO_ELEMENT_KEYS: # update window with the values read from settings file
|
||||
try:
|
||||
window[SETTINGS_KEYS_TO_ELEMENT_KEYS[key]].update(value=settings[key])
|
||||
except Exception as e:
|
||||
print(f'Problem updating PySimpleGUI window from settings. Key = {key}')
|
||||
|
||||
return window
|
||||
|
||||
########################################## Main Program Window & Event Loop ##########################################
|
||||
def create_main_window(settings):
|
||||
sg.theme(settings['theme'])
|
||||
|
||||
layout = [[sg.T('This is my main application')],
|
||||
[sg.T('Add your primary window stuff in here')],
|
||||
[sg.B('Ok'), sg.B('Exit'), sg.B('Change Settings')]]
|
||||
|
||||
return sg.Window('Main Application', layout)
|
||||
|
||||
|
||||
def main():
|
||||
window, settings = None, load_settings(SETTINGS_FILE, DEFAULT_SETTINGS )
|
||||
|
||||
while True: # Event Loop
|
||||
if window is None:
|
||||
window = create_main_window(settings)
|
||||
|
||||
event, values = window.read()
|
||||
if event in (None, 'Exit'):
|
||||
break
|
||||
if event == 'Change Settings':
|
||||
event, values = create_settings_window(settings).read(close=True)
|
||||
if event == 'Save':
|
||||
window.close()
|
||||
window = None
|
||||
save_settings(SETTINGS_FILE, settings, values)
|
||||
window.close()
|
||||
main()
|
Loading…
Reference in New Issue