Rehber Python Güç Planı Yöneticisi

saydut

Kilopat
Katılım
9 Eylül 2017
Mesajlar
253
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
Merhaba bir diğer projemi siz değerli arkadaşlarım ile paylaşmak istiyorum.
Program Windows'ta ayarladığınız (veya özelleştirdiğiniz) güç seçeneklerini hızlı bir şekilde değiştirmenize olanak sağlıyor.

Laptopumda etkin bir şekilde kullanmaktayım mesela oyun oynarken nihai performansta Web'de gezinirken ya da iş yaparken güç tasarrufunda çalışıyorum bu da sıcaklık ve güç kazancı olarak fayda sağlıyor. Özelikle laptop kullanan arkadaşlarıma öneririm.

Program yine açık kaynak kodlu kendi isteğinize göre özelleştirebilirsiniz.

İndirme linki: https://gitlab.com/saydut/power-plans-with-python/-/raw/main/mysetup.zip?ref_type=heads&inline=false

Kaynak kodları:
Python:
import os
import subprocess
import requests
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QGridLayout, QPushButton, QLineEdit, QMessageBox, QLabel
import re
import functools
import tempfile
import zipfile
import sys

class UpdateManager:
    def __init__(self, version_label):
        self.version_label = version_label
        self.parent = version_label.parent() if version_label else None  # Ebeveyn pencereyi almak için
        self.prog_ver_check()

    def apply_update(self, temp_exe_path, current_exe_path):
        try:
            os.replace(temp_exe_path, current_exe_path)
            return True
        except Exception as e:
            print(f"Hata: {e}")
            return False

    def download_update(self, url, dest_path):
        try:
            response = requests.get(url, stream=True)
            with open(dest_path, 'wb') as file:
                for chunk in response.iter_content(chunk_size=1024):
                    if chunk:
                        file.write(chunk)
        except Exception as e:
            print(f"Hata: {e}")

    def extract_zip(self, zip_path, extract_path):
        try:
            with zipfile.ZipFile(zip_path, 'r') as zip_ref:
                zip_ref.extractall(extract_path)
            return extract_path
        except Exception as e:
            print(f"Hata: {e}")
            return None

    def get_single_exe_in_directory(self, directory):
        exe_files = [f for f in os.listdir(directory) if f.lower().endswith('.exe') and os.path.isfile(os.path.join(directory, f))]

        if len(exe_files) == 1:
            return os.path.join(directory, exe_files[0])
        else:
            return None

    def create_update_script(self, temp_exe_path, current_exe_path):
        # Bat dosyasını oluştur
        bat_content = f'@echo off\n'
        bat_content += f'taskkill /IM "{os.path.basename(current_exe_path)}" /F\n'  # Uygulama kapat
        bat_content += f'ping 127.0.0.1 -n 2 > nul\n'  # Kısa bir bekleme
        bat_content += f'start "" "{temp_exe_path}"\n'
        bat_content += f'exit\n'  # Bat dosyasından çık
        bat_path = os.path.join(tempfile.gettempdir(), "update_script.bat")
        with open(bat_path, 'w') as bat_file:
            bat_file.write(bat_content)
        return bat_path

    def run_update_script(self, bat_path):
        try:
            subprocess.run(bat_path, shell=True)
            return True
        except Exception as e:
            print(f"Hata: {e}")
            return False

    def prog_ver_check(self):
        gitlab_url = "https://gitlab.com/saydut/power-plans-with-python/-/raw/main/version.txt?ref_type=heads"

        local_version = self.version_label.text().split(":")[-1].strip()

        try:
            response = requests.get(gitlab_url)
            remote_version_info = response.text.strip().split('\n')
            remote_version = remote_version_info[0]
            release_notes_start = response.text.find('*')
            release_notes = response.text[release_notes_start:].split('link=')[0].strip()
            update_link_start = response.text.find('link=')
            update_link = response.text[update_link_start + 5:].strip()

            if remote_version > local_version:
                # Yeni sürüm mevcut! Güncelleme yapılabilir.
                notes_response = requests.get(gitlab_url)
                release_notes = self.extract_release_notes(notes_response.text)

                result = QMessageBox.question(self.parent, "Yeni Sürüm", f"Yeni bir sürüm mevcut!\nGüncelleme yapmak ister misiniz?\n\n{release_notes}", QMessageBox.Yes | QMessageBox.No)

                if result == QMessageBox.Yes:
                    # Kullanıcı evet dediği durum
                    print("Güncelleme işlemleri burada başlayacak.")
                    temp_zip_path = os.path.join(tempfile.gettempdir(), "temp_update.zip")
                    temp_exe_path = os.path.join(tempfile.gettempdir(), "temp_update.exe")

                    # Zip dosyasını indir ve çıkar
                    self.download_update(update_link, temp_zip_path)
                    extracted_path = self.extract_zip(temp_zip_path, tempfile.gettempdir())  # Zip dosyasını çıkar
                    exe_path = self.get_single_exe_in_directory(extracted_path)  # Çıkarılan dizindeki tek exe dosyasını al

                    # Bat dosyasını oluştur ve çalıştır
                    bat_path = self.create_update_script(exe_path, sys.executable)
                    self.run_update_script(bat_path)
                  
                    # Güncelleme script'i çalıştıktan sonra programı kapat
                    sys.exit()
            else:
                print("Güncelleme yok.")
        except requests.RequestException as e:
            print(f"Hata: {e}")

    def extract_release_notes(self, version_txt_content):
        # version.txt içinden yenilik notlarını çıkar
        start_index = version_txt_content.find('*')
        if start_index != -1:
            end_index = version_txt_content.find('\n', start_index)
            if end_index != -1:
                release_notes = version_txt_content[start_index:end_index].strip('* \t\n')
                return release_notes
        return "Yenilik notları bulunamadı."

class PowerPlanChanger(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("Güç Planı Değiştirici")
        self.setGeometry(100, 100, 250, 120)

        main_layout = QVBoxLayout()

        self.filter_edit = QLineEdit()
        self.filter_edit.setPlaceholderText("Filtreleme metni girin")
        self.filter_edit.hide()
        self.filter_edit.setReadOnly(True)
        self.filter_edit.setText("guid")
        self.filter_edit.textChanged.connect(self.refresh_power_plans)

        main_layout.addWidget(self.filter_edit)

        self.plan_layout = QGridLayout()

        main_layout.addLayout(self.plan_layout)

        self.setLayout(main_layout)

        self.selected_button = None  # Seçili buton için referans

        # Güncelleme işlevi ekleniyor
        self.version_label = QLabel("Sürüm: 2.1", parent=self)
        self.version_label.hide()  # Sürüm etiketini gizle

        self.update_manager = UpdateManager(self.version_label)
        self.refresh_power_plans()

    def refresh_power_plans(self):
        try:
            self.clear_plan_layout()

            output = subprocess.check_output(['powercfg', '/l'], shell=True, stderr=subprocess.STDOUT)
            plans = output.decode('utf-8', errors='ignore').split('\r\n')
            plans = [plan.strip() for plan in plans if plan.strip()]

            filter_text = self.filter_edit.text().strip().lower()

            row = 0
            col = 0
            marked_plan = None
            for plan in plans:
                if self.is_guid(filter_text) and filter_text in plan.lower():
                    plan_name = re.search(r'\((.*?)\)', plan).group(1)  # Parantez içindeki kısmı alıyoruz
                    btn = QPushButton(plan_name)
                    btn.clicked.connect(lambda checked, p=plan: self.on_button_clicked(btn, p))
                    self.plan_layout.addWidget(btn, row, col)
                    if '*' in plan:  # Eğer plan işaretlenmişse
                        marked_plan = btn
                    row += 1
                    if row > 5:
                        row = 0
                        col += 1
                elif not self.is_guid(filter_text) and filter_text in plan.lower():
                    plan_name = re.search(r'\((.*?)\)', plan).group(1)
                    btn = QPushButton(plan_name)
                    on_button_click = functools.partial(self.on_button_clicked, btn, plan)
                    btn.clicked.connect(on_button_click)
                    self.plan_layout.addWidget(btn, row, col)
                    if '*' in plan:
                        marked_plan = btn
                    row += 1
                    if row > 5:
                        row = 0
                        col += 1

            if marked_plan:  # İşaretli plan varsa
                self.change_button_color(marked_plan)

        except subprocess.CalledProcessError as e:
            print(f"Hata: {e.output}")

    def clear_plan_layout(self):
        for i in reversed(range(self.plan_layout.count())):
            widget = self.plan_layout.itemAt(i).widget()
            if widget is not None:
                widget.deleteLater()

    def is_guid(self, text):
        pattern = re.compile(r'^[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$')
        return bool(pattern.match(text))

    def apply_power_plan(self, plan):
        try:
            plan_guid = plan.split()[3]
            subprocess.run(['powercfg', '/setactive', plan_guid], capture_output=True)
            print(f"{plan} planı aktif edildi.")
        except Exception as e:
            print(f"Hata: {e}")

    def on_button_clicked(self, button, plan):
        self.apply_power_plan(plan)  # Güç planını uygula
  
        # Tüm butonların arka plan rengini varsayılan yap
        for row in range(self.plan_layout.rowCount()):
            for col in range(self.plan_layout.columnCount()):
                item = self.plan_layout.itemAtPosition(row, col)
                if item and item.widget():
                    item.widget().setStyleSheet("")

        # Tıklanan butonun arka plan rengini yeşil yap
        button.setStyleSheet("background-color: green; color: white;")

    def change_button_color(self, button):
        if self.selected_button and self.selected_button != button:
            self.selected_button.setStyleSheet("")
        self.selected_button = button
        self.selected_button.setStyleSheet("background-color: green; color: white;")

def main():
    app = QApplication(sys.argv)
    window = PowerPlanChanger()
    window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
 

Dosya Ekleri

  • Ekran görüntüsü 2024-01-24 003056.png
    Ekran görüntüsü 2024-01-24 003056.png
    4,9 KB · Görüntüleme: 40
  • Ekran görüntüsü 2024-01-24 003108.png
    Ekran görüntüsü 2024-01-24 003108.png
    5 KB · Görüntüleme: 35
  • Ekran görüntüsü 2024-01-24 003120.png
    Ekran görüntüsü 2024-01-24 003120.png
    4,9 KB · Görüntüleme: 34
Son düzenleyen: Moderatör:

Yeni konular

Yeni mesajlar

Geri
Yukarı