tkinter
не имеет специальных функций для чтения и записи конфигурации, поэтому вам придется делать это самостоятельно. Используйте стандартные open()
, read()
, write()
, close()
или модули, чтобы сохранить его в файле JSON
, YAML
или .ini
. Вам нужно будет прочитать конфигурацию до Tk()
(если вы хотите использовать confing для создания windgets) или до mainloop()
(если вы хотите изменить существующие виджеты) и сохранить его после mainloop()
(или при изменении состояния)
Я использую JSON
для сохранения конфигурации, потому что это стандартный модуль (поэтому вам не нужно его устанавливать), и он преобразует текст с числом в целочисленное / плавающее значение, текст "false / true" в логическое значение False/True
, et c. (так что потребуется меньше работы / кода)
Чтение:
with open('config.txt') as fh:
config = json.load(fh)
count = config['count']
run = config['run']
Сохранить:
config = {
'count': count,
'run': run,
}
with open('config.txt', 'w') as fh:
json.dump(config, fh)
Потому что после получения конфигурации из файла я также хочу обновить текст на этикетке и кнопках, поэтому я прочитал конфигурацию после создания всех виджетов.
# read after creating widgets because config updates text on label and buttons
load_config()
base.mainloop()
# save after closing window
save_config()
Полный код с другими изменениями
PEP 8 - Руководство по стилю для Python кода
import json
import tkinter as tk
# --- functions ---
def update():
global count # PEP8: all `global` at the beginning to make it more readable
if run:
# just before starting
if count == -1:
show = "Starting"
else:
show = count
stopwatch['text'] = show # there is no need to use `str()`
# increment the count after every 1 second
count += 1
stopwatch.after(1000, update)
# while running
def on_start(): # PEP8: lower_case_names for functions
global run
run = True
start['state'] = 'disabled'
stop['state'] = 'normal'
reset['state'] = 'normal'
update()
# while stopped
def on_stop(): # PEP8: lower_case_names for functions
global run
run = False
start['state'] = 'normal'
stop['state'] = 'disabled'
reset['state'] = 'normal'
# for reset
def on_reset(): # PEP8: lower_case_names for functions
global count
count = -1
#if run == False:
#if run is False: # PEP8: `is False` instead `== False`
if not run: # PEP8: more preferred then `is False` (and you can read it like English text)
reset['state'] = 'disabled'
stopwatch['text'] = 'Welcome'
else:
stopwatch['text'] = 'Start'
def load_config():
global count
global run
try:
with open('config.txt') as fh:
config = json.load(fh)
print('[DEBUG] load_config:', config)
count = config['count']
run = config['run']
# update label and buttons
if count > -1:
# update text on label
stopwatch['text'] = count
# continue counting and/or update text on buttons
if run:
on_start()
else:
on_stop()
except Exception as ex:
# if there is empty/broken config file (or it doesn't exist yet)
print('Exception:', ex)
def save_config():
# create data to save
config = {
'count': count,
'run': run,
}
print('[DEBUG] save_config:', config)
with open('config.txt', 'w') as fh:
json.dump(config, fh)
# --- main ---
count = -1
run = False
base = tk.Tk()
base.title("Alyssa's Stopwatch")
base.minsize(width=300, height=200,)
stopwatch = tk.Label(base, text="Let's begin!",
fg="#ff5ca5", font="Times 25 bold", bg="white")
stopwatch.pack()
start = tk.Button(base, text='Start',
fg="#c978ff", width=25, command=on_start)
stop = tk.Button(base, text='Stop',
fg="#78b0ff", width=25, state='disabled', command=on_stop)
reset = tk.Button(base, text='Reset',
fg="#92fcbb", width=25, state='disabled', command=on_reset)
start.pack()
stop.pack()
reset.pack()
# read after creating widgets because config updates text on label and buttons
load_config()
base.mainloop()
# save after closing window
save_config()