05/23 Phase 3

This commit is contained in:
2026-05-23 11:18:25 -04:00
parent f33962cb15
commit 5dcf93a85f
7 changed files with 467 additions and 19 deletions
+33 -9
View File
@@ -16,6 +16,7 @@ from apscheduler.schedulers.background import BackgroundScheduler
from db.database import init_db
from core.fetcher import fetch_all
from ui.statusbar import StatusBar
from ui.history import HistoryScreen
logging.basicConfig(
level=logging.INFO,
@@ -38,10 +39,13 @@ class LottoSightApp(tk.Tk):
self._fetch_lock = threading.Lock()
self._scheduler: BackgroundScheduler | None = None
self._current_screen: tk.Widget | None = None
self._screens: dict[str, tk.Widget] = {}
self._build_ui()
self._start_scheduler()
self._launch_fetch() # auto-fetch on startup
self._navigate("History") # open History as default for now
self._launch_fetch() # auto-fetch on startup
# ── UI construction ───────────────────────────────────────────────────────
@@ -65,15 +69,10 @@ class LottoSightApp(tk.Tk):
)
self._fetch_btn.pack(side="right", padx=4)
# Content area — replaced by real screens in later phases
self._content = ttk.Frame(self, padding=16)
# Content area — screens are packed/unpacked inside here
self._content = ttk.Frame(self)
self._content.pack(side="top", fill="both", expand=True)
self._content_label = ttk.Label(
self._content, text="Dashboard", font=("TkDefaultFont", 14)
)
self._content_label.pack(expand=True)
# Status bar
self._statusbar = StatusBar(self)
self._statusbar.pack(side="bottom", fill="x")
@@ -82,7 +81,29 @@ class LottoSightApp(tk.Tk):
def _navigate(self, screen_name: str):
logger.info("Navigate → %s", screen_name)
self._content_label.config(text=screen_name)
if self._current_screen is not None:
self._current_screen.pack_forget()
if screen_name not in self._screens:
self._screens[screen_name] = self._make_screen(screen_name)
self._current_screen = self._screens[screen_name]
self._current_screen.pack(fill="both", expand=True)
# Refresh data-bearing screens each time they're shown
if hasattr(self._current_screen, "refresh"):
self._current_screen.refresh()
def _make_screen(self, name: str) -> tk.Widget:
if name == "History":
return HistoryScreen(self._content)
# Placeholder for screens added in later phases
placeholder = ttk.Label(
self._content, text=f"{name} — coming soon",
font=("TkDefaultFont", 14), anchor="center",
)
return placeholder
# ── Fetch wiring ──────────────────────────────────────────────────────────
@@ -126,6 +147,9 @@ class LottoSightApp(tk.Tk):
def _on_fetch_done(self, results: list):
self._fetch_btn.config(state="normal", text="Fetch Now")
self._statusbar.update_fetch_results(results)
# Refresh the current screen if it can show new data
if self._current_screen and hasattr(self._current_screen, "refresh"):
self._current_screen.refresh()
# ── Lifecycle ─────────────────────────────────────────────────────────────