Compare commits
2 Commits
v0.1.0-alp
...
v0.1.0-alp
| Author | SHA1 | Date | |
|---|---|---|---|
| d5b5c255e8 | |||
| 564e4c9c9c |
@@ -85,6 +85,74 @@ if ! grep -q '\.\./app/src' "$PTH_FILE"; then
|
|||||||
fi
|
fi
|
||||||
echo " Patched $(basename "$PTH_FILE")"
|
echo " Patched $(basename "$PTH_FILE")"
|
||||||
|
|
||||||
|
# ── Bundle tkinter into embedded Python ───────────────────────
|
||||||
|
# Embedded Python doesn't include tkinter. We download it from the
|
||||||
|
# official Windows Python nuget package (same version) which contains
|
||||||
|
# the _tkinter.pyd, tkinter/ package, and Tcl/Tk DLLs.
|
||||||
|
|
||||||
|
echo "[3b/8] Bundling tkinter for screen overlay support..."
|
||||||
|
|
||||||
|
# Python minor version for nuget package (e.g., 3.11.9 -> 3.11)
|
||||||
|
PYTHON_MINOR="${PYTHON_VERSION%.*}"
|
||||||
|
|
||||||
|
# Download the full Python nuget package (contains all stdlib + DLLs)
|
||||||
|
NUGET_URL="https://www.nuget.org/api/v2/package/python/${PYTHON_VERSION}"
|
||||||
|
NUGET_PKG="$BUILD_DIR/python-nuget.zip"
|
||||||
|
if [ ! -f "$NUGET_PKG" ]; then
|
||||||
|
curl -sL "$NUGET_URL" -o "$NUGET_PKG"
|
||||||
|
fi
|
||||||
|
|
||||||
|
NUGET_DIR="$BUILD_DIR/python-nuget"
|
||||||
|
rm -rf "$NUGET_DIR"
|
||||||
|
mkdir -p "$NUGET_DIR"
|
||||||
|
unzip -qo "$NUGET_PKG" -d "$NUGET_DIR"
|
||||||
|
|
||||||
|
# Copy _tkinter.pyd (the C extension)
|
||||||
|
TKINTER_PYD=$(find "$NUGET_DIR" -name "_tkinter.pyd" | head -1)
|
||||||
|
if [ -n "$TKINTER_PYD" ]; then
|
||||||
|
cp "$TKINTER_PYD" "$PYTHON_DIR/"
|
||||||
|
echo " Copied _tkinter.pyd"
|
||||||
|
else
|
||||||
|
echo " WARNING: _tkinter.pyd not found in nuget package"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Copy tkinter Python package from the stdlib zip or Lib/
|
||||||
|
# The nuget package has Lib/tkinter/
|
||||||
|
TKINTER_PKG=$(find "$NUGET_DIR" -type d -name "tkinter" | head -1)
|
||||||
|
if [ -n "$TKINTER_PKG" ]; then
|
||||||
|
mkdir -p "$PYTHON_DIR/Lib"
|
||||||
|
cp -r "$TKINTER_PKG" "$PYTHON_DIR/Lib/tkinter"
|
||||||
|
echo " Copied tkinter/ package"
|
||||||
|
else
|
||||||
|
echo " WARNING: tkinter package not found in nuget package"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Copy Tcl/Tk DLLs (tcl86t.dll, tk86t.dll, etc.)
|
||||||
|
for dll in tcl86t.dll tk86t.dll; do
|
||||||
|
DLL_PATH=$(find "$NUGET_DIR" -name "$dll" | head -1)
|
||||||
|
if [ -n "$DLL_PATH" ]; then
|
||||||
|
cp "$DLL_PATH" "$PYTHON_DIR/"
|
||||||
|
echo " Copied $dll"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Copy Tcl/Tk data directories (tcl8.6, tk8.6)
|
||||||
|
for tcldir in tcl8.6 tk8.6; do
|
||||||
|
TCL_PATH=$(find "$NUGET_DIR" -type d -name "$tcldir" | head -1)
|
||||||
|
if [ -n "$TCL_PATH" ]; then
|
||||||
|
cp -r "$TCL_PATH" "$PYTHON_DIR/$tcldir"
|
||||||
|
echo " Copied $tcldir/"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Add Lib to ._pth so tkinter package is importable
|
||||||
|
if ! grep -q '^Lib$' "$PTH_FILE"; then
|
||||||
|
echo 'Lib' >> "$PTH_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "$NUGET_DIR"
|
||||||
|
echo " tkinter bundled successfully"
|
||||||
|
|
||||||
# ── Download pip and install into embedded Python ────────────
|
# ── Download pip and install into embedded Python ────────────
|
||||||
|
|
||||||
echo "[4/8] Installing pip into embedded Python..."
|
echo "[4/8] Installing pip into embedded Python..."
|
||||||
@@ -243,22 +311,11 @@ cd /d "%~dp0"
|
|||||||
set PYTHONPATH=%~dp0app\src
|
set PYTHONPATH=%~dp0app\src
|
||||||
set WLED_CONFIG_PATH=%~dp0app\config\default_config.yaml
|
set WLED_CONFIG_PATH=%~dp0app\config\default_config.yaml
|
||||||
|
|
||||||
:: Read port from env var or use default
|
|
||||||
if "%WLED_SERVER__PORT%"=="" set WLED_SERVER__PORT=8080
|
|
||||||
|
|
||||||
:: Create data directory if missing
|
:: Create data directory if missing
|
||||||
if not exist "%~dp0data" mkdir "%~dp0data"
|
if not exist "%~dp0data" mkdir "%~dp0data"
|
||||||
if not exist "%~dp0logs" mkdir "%~dp0logs"
|
if not exist "%~dp0logs" mkdir "%~dp0logs"
|
||||||
|
|
||||||
echo.
|
:: Start the server — reads port from config, prints its own banner
|
||||||
echo =============================================
|
|
||||||
echo LedGrab v${VERSION_CLEAN}
|
|
||||||
echo Open http://localhost:%WLED_SERVER__PORT% in your browser
|
|
||||||
echo =============================================
|
|
||||||
echo.
|
|
||||||
|
|
||||||
:: Start the server — uses config from WLED_CONFIG_PATH, port from config or env
|
|
||||||
start "" /b cmd /c "timeout /t 2 /nobreak >nul && start http://localhost:%WLED_SERVER__PORT%"
|
|
||||||
"%~dp0python\python.exe" -m wled_controller.main
|
"%~dp0python\python.exe" -m wled_controller.main
|
||||||
|
|
||||||
pause
|
pause
|
||||||
|
|||||||
@@ -101,18 +101,8 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|||||||
export PYTHONPATH="$SCRIPT_DIR/app/src"
|
export PYTHONPATH="$SCRIPT_DIR/app/src"
|
||||||
export WLED_CONFIG_PATH="$SCRIPT_DIR/app/config/default_config.yaml"
|
export WLED_CONFIG_PATH="$SCRIPT_DIR/app/config/default_config.yaml"
|
||||||
|
|
||||||
# Read port from env var or use default
|
|
||||||
PORT="${WLED_SERVER__PORT:-8080}"
|
|
||||||
|
|
||||||
mkdir -p "$SCRIPT_DIR/data" "$SCRIPT_DIR/logs"
|
mkdir -p "$SCRIPT_DIR/data" "$SCRIPT_DIR/logs"
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo " ============================================="
|
|
||||||
echo " LedGrab vVERSION_PLACEHOLDER"
|
|
||||||
echo " Open http://localhost:$PORT in your browser"
|
|
||||||
echo " ============================================="
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
source "$SCRIPT_DIR/venv/bin/activate"
|
source "$SCRIPT_DIR/venv/bin/activate"
|
||||||
exec python -m wled_controller.main
|
exec python -m wled_controller.main
|
||||||
LAUNCHER
|
LAUNCHER
|
||||||
|
|||||||
@@ -278,7 +278,12 @@ class OverlayManager:
|
|||||||
|
|
||||||
def _start_tk_thread(self) -> None:
|
def _start_tk_thread(self) -> None:
|
||||||
def _run():
|
def _run():
|
||||||
import tkinter as tk # lazy import — tkinter unavailable in headless CI
|
try:
|
||||||
|
import tkinter as tk # lazy import — tkinter unavailable in embedded Python / headless CI
|
||||||
|
except ImportError:
|
||||||
|
logger.warning("tkinter not available — screen overlay disabled")
|
||||||
|
self._tk_ready.set()
|
||||||
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self._tk_root = tk.Tk()
|
self._tk_root = tk.Tk()
|
||||||
|
|||||||
@@ -98,6 +98,10 @@ async def lifespan(app: FastAPI):
|
|||||||
logger.info(f"Starting LED Grab v{__version__}")
|
logger.info(f"Starting LED Grab v{__version__}")
|
||||||
logger.info(f"Python version: {sys.version}")
|
logger.info(f"Python version: {sys.version}")
|
||||||
logger.info(f"Server listening on {config.server.host}:{config.server.port}")
|
logger.info(f"Server listening on {config.server.host}:{config.server.port}")
|
||||||
|
print(f"\n =============================================")
|
||||||
|
print(f" LED Grab v{__version__}")
|
||||||
|
print(f" Open http://localhost:{config.server.port} in your browser")
|
||||||
|
print(f" =============================================\n")
|
||||||
|
|
||||||
# Validate authentication configuration
|
# Validate authentication configuration
|
||||||
if not config.auth.api_keys:
|
if not config.auth.api_keys:
|
||||||
|
|||||||
Reference in New Issue
Block a user