import tkinter as tk import os from pathlib import Path import sqlite3 APP_NAME = "SC KF" class PersistentConfig: def __init__(self, db_path: Path): self.table_name = "properties" self.db = sqlite3.connect( str(db_path), isolation_level=None, check_same_thread=False, autocommit=True ) self.db.execute("pragma journal_mode=wal;") self.db.execute( f"create table if not exists {self.table_name} (key text primary key, value_str text, value_int int) strict;" ) def set_int(self, key: str, value: int) -> None: self.db.execute( f"insert into {self.table_name} (key, value_int) values (:key, :value) on conflict (key) do update set value_int = :value;", {"key": key, "value": value}, ) def get_int(self, key: str, default=None) -> int | None: res = self.db.execute( f"select value_int from {self.table_name} where key = ?;", (key,) ) return next(iter(res), (default,))[0] def set_str(self, key: str, value: str) -> None: self.db.execute( f"insert into {self.table_name} (key, value_str) values (:key, :value) on conflict (key) do update set value_str = :value;", {"key": key, "value": value}, ) def get_str(self, key: str, default=None) -> str | None: res = self.db.execute( f"select value_str from {self.table_name} where key = ?;", (key,) ) return next(iter(res), (default,))[0] def set_bool(self, key: str, value: bool) -> None: self.set_int(key, int(value)) def get_bool(self, key: str, default=None) -> bool | None: return bool(self.get_int(key, default)) def get_tk_boolean(self, name: str, default: bool) -> tk.BooleanVar: value = self.get_bool(name, default) var = tk.BooleanVar(name=name, value=value) var.trace_add("write", lambda a, b, c: self.set_bool(name, var.get())) return var def get_tk_str(self, name: str, default: str | None) -> tk.StringVar: value = self.get_str(name, default) var = tk.StringVar(name=name, value=value) var.trace_add("write", lambda a, b, c: self.set_str(name, var.get())) return var def get_tk_int(self, name: str, default: int | None) -> tk.IntVar: value = self.get_int(name, default) var = tk.IntVar(name=name, value=value) var.trace_add("write", lambda a, b, c: self.set_int(name, var.get())) return var def get_app_data_dir() -> Path: if os.name == "nt": directory = Path.home() / "AppData/Roaming/SCKF" elif os.name == "posix": directory = Path.home() / ".config/SCKF" else: raise RuntimeError(f"Unsupported os: {os.name}") directory.mkdir(exist_ok=True, parents=True) return directory db = PersistentConfig(get_app_data_dir() / "config.sqlite")