kodline
import sys
import os
import time
from threading import Thread
import sqlite3
from datetime import datetime, timedelta
import psutil
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton, QLabel, QSystemTrayIcon, QMenu, QAction, QTableWidget, QTableWidgetItem, QHeaderView
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import Qt, QTimer, pyqtSignal
from plyer import notification
from PIL import Image, ImageDraw, ImageQt
DB_FILE = "/sdcard/battery_stats.db"
CHECK_INTERVAL = 300 # 5 dakikada bir kontrol et
class BatteryMonitor(QMainWindow):
update_signal = pyqtSignal(int, bool)
def __init__(self):
super().__init__()
self.initUI()
self.initDB()
self.monitoring = False
self.monitor_thread = None
self.update_signal.connect(self.update_ui)
def initUI(self):
self.setWindowTitle('Akıllı Pil İzleyici')
self.setGeometry(100, 100, 400, 500)
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout()
self.status_label = QLabel('Durum: İzleme Kapalı', self)
layout.addWidget(self.status_label)
self.battery_icon = QLabel(self)
layout.addWidget(self.battery_icon)
self.battery_level = QLabel('Pil Seviyesi: ---%', self)
layout.addWidget(self.battery_level)
self.start_stop_button = QPushButton('İzlemeyi Başlat', self)
self.start_stop_button.clicked.connect(self.toggle_monitoring)
layout.addWidget(self.start_stop_button)
self.stats_table = QTableWidget(self)
self.stats_table.setColumnCount(3)
self.stats_table.setHorizontalHeaderLabels(['Zaman', 'Yüzde', 'Şarjda'])
self.stats_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
layout.addWidget(self.stats_table)
central_widget.setLayout(layout)
# Sistem tepsisi ikonu
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(QIcon(self.create_battery_icon(100)))
tray_menu = QMenu()
show_action = QAction("Göster", self)
quit_action = QAction("Çıkış", self)
show_action.triggered.connect(self.show)
quit_action.triggered.connect(self.quit_app)
tray_menu.addAction(show_action)
tray_menu.addAction(quit_action)
self.tray_icon.setContextMenu(tray_menu)
self.tray_icon.show()
# Düzenli UI güncellemeleri
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_stats_table)
self.timer.start(60000) # Her dakika güncelle
def initDB(self):
conn = sqlite3.connect(DB_FILE)
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS battery_stats
(timestamp TEXT, percent INTEGER, plugged INTEGER)''')
conn.commit()
conn.close()
def toggle_monitoring(self):
if not self.monitoring:
self.start_monitoring()
else:
self.stop_monitoring()
def start_monitoring(self):
self.monitoring = True
self.status_label.setText('Durum: İzleniyor')
self.start_stop_button.setText('İzlemeyi Durdur')
self.monitor_thread = Thread(target=self.monitor_battery, daemon=True)
self.monitor_thread.start()
def stop_monitoring(self):
self.monitoring = False
self.status_label.setText('Durum: İzleme Kapalı')
self.start_stop_button.setText('İzlemeyi Başlat')
def monitor_battery(self):
last_notified = 100
while self.monitoring:
percent, plugged = self.check_battery()
self.log_battery_stat(percent, plugged)
self.update_signal.emit(percent, plugged)
if not plugged:
if (percent <= 10 and last_notified > 10) or \
(percent <= 5 and last_notified > 5) or \
(percent <= 1 and last_notified > 1):
self.show_notification(percent)
last_notified = percent
else:
last_notified = 100
time.sleep(CHECK_INTERVAL)
def check_battery(self):
battery = psutil.sensors_battery()
return battery.percent, battery.power_plugged
def log_battery_stat(self, percent, plugged):
conn = sqlite3.connect(DB_FILE)
c = conn.cursor()
c.execute("INSERT INTO battery_stats VALUES (?, ?, ?)",
(datetime.now().isoformat(), percent, int(plugged)))
conn.commit()
conn.close()
def show_notification(self, percent):
icon_path = self.create_battery_icon(percent)
title = f'Düşük Şarj Uyarısı: %{percent}'
message = f'Şarjınız %{percent}! Lütfen cihazınızı şarj edin.'
notification.notify(
title=title,
message=message,
app_icon=icon_path,
timeout=10,
)
def create_battery_icon(self, percent):
img = Image.new('RGB', (100, 50), color='white')
d = ImageDraw.Draw(img)
d.rectangle([5, 5, 95, 45], outline="black")
d.rectangle([95, 15, 100, 35], fill="black")
d.rectangle([5, 5, 5 + int(90 * percent / 100), 45], fill="green")
icon_path = "/sdcard/battery_icon.png"
img.save(icon_path)
return icon_path
def update_ui(self, percent, plugged):
self.battery_level.setText(f'Pil Seviyesi: %{percent}')
icon = QIcon(self.create_battery_icon(percent))
self.tray_icon.setIcon(icon)
pixmap = icon.pixmap(100, 50)
self.battery_icon.setPixmap(pixmap)
self.update_stats_table()
def update_stats_table(self):
conn = sqlite3.connect(DB_FILE)
c = conn.cursor()
c.execute("SELECT * FROM battery_stats ORDER BY timestamp DESC LIMIT 10")
rows = c.fetchall()
conn.close()
self.stats_table.setRowCount(len(rows))
for i, row in enumerate(rows):
self.stats_table.setItem(i, 0, QTableWidgetItem(row[0]))
self.stats_table.setItem(i, 1, QTableWidgetItem(f"%{row[1]}"))
self.stats_table.setItem(i, 2, QTableWidgetItem("Evet" if row[2] else "Hayır"))
def quit_app(self):
self.monitoring = False
QApplication.quit()
def closeEvent(self, event):
event.ignore()
self.hide()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = BatteryMonitor()
ex.show()
sys.exit(app.exec_())