45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
|
|
"""Bottom status bar: battery level + current time, refreshed every second.
|
||
|
|
Battery is read via psutil (cross-platform); on a desktop machine with no
|
||
|
|
battery, psutil.sensors_battery() returns None and the bar just shows time.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
from textual.widgets import Static
|
||
|
|
|
||
|
|
try:
|
||
|
|
import psutil
|
||
|
|
except ImportError:
|
||
|
|
psutil = None # battery display degrades gracefully to time-only
|
||
|
|
|
||
|
|
|
||
|
|
class StatusBar(Static):
|
||
|
|
def on_mount(self) -> None:
|
||
|
|
self._refresh()
|
||
|
|
self.set_interval(1.0, self._refresh)
|
||
|
|
|
||
|
|
def _refresh(self) -> None:
|
||
|
|
self.update(self._render_text())
|
||
|
|
|
||
|
|
def _render_text(self) -> str:
|
||
|
|
parts = []
|
||
|
|
battery = self._battery_text()
|
||
|
|
if battery:
|
||
|
|
parts.append(battery)
|
||
|
|
parts.append(datetime.now().strftime("%H:%M:%S"))
|
||
|
|
return " ".join(parts)
|
||
|
|
|
||
|
|
def _battery_text(self) -> str | None:
|
||
|
|
if psutil is None:
|
||
|
|
return None
|
||
|
|
try:
|
||
|
|
battery = psutil.sensors_battery()
|
||
|
|
except Exception:
|
||
|
|
return None
|
||
|
|
if battery is None:
|
||
|
|
return None
|
||
|
|
state = "lädt" if battery.power_plugged else "Akku"
|
||
|
|
return f"{state} {round(battery.percent)}%"
|