def update_icon(self): percent, is_charging = self.get_battery_status() if percent is not None: icon_image = self.create_battery_icon(percent, is_charging) if self.icon: self.icon.icon = icon_image # Update every 5 seconds threading.Timer(5, self.update_icon).start()

def create_battery_icon(self, percent, is_charging): # Create icon image size = 64 image = Image.new('RGBA', (size, size), (0, 0, 0, 0)) draw = ImageDraw.Draw(image) # Battery outline draw.rectangle( [(8, 20), (56, 44)], outline='white', width=2 ) # Battery terminal draw.rectangle( [(56, 28), (60, 36)], fill='white' ) # Battery level fill_width = int(48 * (percent / 100)) draw.rectangle( [(10, 22), (10 + fill_width, 42)], fill='#00ff00' if percent > 20 else '#ff0000' ) # Charging indicator if is_charging: draw.line([(28, 12), (36, 12)], fill='#00ff00', width=2) draw.line([(32, 12), (32, 20)], fill='#00ff00', width=2) return image

def get_icon_name(self, percent, is_charging): if is_charging: return "battery-charging" elif percent >= 90: return "battery-full" elif percent >= 60: return "battery-good" elif percent >= 30: return "battery-low" else: return "battery-caution"

def quit(self, source): Gtk.main_quit() if == " main ": indicator = BatteryIndicator() Gtk.main() macOS (Swift) import Cocoa import IOKit.ps class BatteryStatusItem: NSObject private var statusItem: NSStatusItem? private var timer: Timer?

def exit_app(self): if self.icon: self.icon.stop() if == " main ": BatteryTrayIcon() Linux (GTK) #!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') gi.require_version('AppIndicator3', '0.1') from gi.repository import Gtk, AppIndicator3 import psutil import threading import time class BatteryIndicator: def init (self): self.indicator = AppIndicator3.Indicator.new( "battery-indicator", "battery-full", AppIndicator3.IndicatorCategory.SYSTEM_SERVICES ) self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)

@objc private func showInfo() let alert = NSAlert() alert.messageText = "Battery Status" alert.informativeText = "Current charge: \(getBatteryPercentage())" alert.runModal()

def create_tray_icon(self): percent, is_charging = self.get_battery_status() icon_image = self.create_battery_icon(percent or 50, is_charging or False) menu = pystray.Menu( pystray.MenuItem("Battery Status", self.show_battery_info), pystray.MenuItem("Exit", self.exit_app) ) self.icon = pystray.Icon("battery", icon_image, "Battery Monitor", menu) # Start update thread self.update_icon() # Run icon self.icon.run()

func applicationDidFinishLaunching(_ notification: Notification) batteryStatusItem = BatteryStatusItem()

Add Battery Icon To Taskbar May 2026

def update_icon(self): percent, is_charging = self.get_battery_status() if percent is not None: icon_image = self.create_battery_icon(percent, is_charging) if self.icon: self.icon.icon = icon_image # Update every 5 seconds threading.Timer(5, self.update_icon).start()

def create_battery_icon(self, percent, is_charging): # Create icon image size = 64 image = Image.new('RGBA', (size, size), (0, 0, 0, 0)) draw = ImageDraw.Draw(image) # Battery outline draw.rectangle( [(8, 20), (56, 44)], outline='white', width=2 ) # Battery terminal draw.rectangle( [(56, 28), (60, 36)], fill='white' ) # Battery level fill_width = int(48 * (percent / 100)) draw.rectangle( [(10, 22), (10 + fill_width, 42)], fill='#00ff00' if percent > 20 else '#ff0000' ) # Charging indicator if is_charging: draw.line([(28, 12), (36, 12)], fill='#00ff00', width=2) draw.line([(32, 12), (32, 20)], fill='#00ff00', width=2) return image

def get_icon_name(self, percent, is_charging): if is_charging: return "battery-charging" elif percent >= 90: return "battery-full" elif percent >= 60: return "battery-good" elif percent >= 30: return "battery-low" else: return "battery-caution" add battery icon to taskbar

def quit(self, source): Gtk.main_quit() if == " main ": indicator = BatteryIndicator() Gtk.main() macOS (Swift) import Cocoa import IOKit.ps class BatteryStatusItem: NSObject private var statusItem: NSStatusItem? private var timer: Timer?

def exit_app(self): if self.icon: self.icon.stop() if == " main ": BatteryTrayIcon() Linux (GTK) #!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') gi.require_version('AppIndicator3', '0.1') from gi.repository import Gtk, AppIndicator3 import psutil import threading import time class BatteryIndicator: def init (self): self.indicator = AppIndicator3.Indicator.new( "battery-indicator", "battery-full", AppIndicator3.IndicatorCategory.SYSTEM_SERVICES ) self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE) def update_icon(self): percent, is_charging = self

@objc private func showInfo() let alert = NSAlert() alert.messageText = "Battery Status" alert.informativeText = "Current charge: \(getBatteryPercentage())" alert.runModal()

def create_tray_icon(self): percent, is_charging = self.get_battery_status() icon_image = self.create_battery_icon(percent or 50, is_charging or False) menu = pystray.Menu( pystray.MenuItem("Battery Status", self.show_battery_info), pystray.MenuItem("Exit", self.exit_app) ) self.icon = pystray.Icon("battery", icon_image, "Battery Monitor", menu) # Start update thread self.update_icon() # Run icon self.icon.run() def update_icon(self): percent

func applicationDidFinishLaunching(_ notification: Notification) batteryStatusItem = BatteryStatusItem()