Seite 1 von 1

Warum laggt es

Verfasst: Mittwoch 12. Februar 2025, 19:41
von The_Freeed
Guten Tag,
Ich hab das Problem das mein wihle True loop meienen completten computer aus laggt. Sollte ich mein code ativieren kann ich nichts mehr öffen bis ich den code deaktiviere.

Code: Alles auswählen

import ctypes
import datetime

night = datetime.time(19, 10, 0)

rigthnow = datetime.datetime.now().time()

while True:
    if rigthnow > night:
        ctypes.windll.user32.SystemParametersInfoW(20, 0, "C:\\Users\\Arthur\\Desktop\\Hintergründe\\lestabed.png", 0)
    else:
        ctypes.windll.user32.SystemParametersInfoW(20, 0, "C:\\Users\\Arthur\\Desktop\\Hintergründe\\lest.jpg", 0)
Das ist der code ich hoffe jemand kann mir helfen

Re: Warum laggt es

Verfasst: Donnerstag 13. Februar 2025, 00:53
von imonbln
Was erwartest du? Das while true hämmert wie wild auf die Funktion ctypes.windll.user32.SystemParametersInfoW ein und diese wird den Bildschirm Neuzeichnen, da du mehrfach pro Sekunde den Hintergrund änderst ( wenn auch immer auf das gleiche Bild).

Idealerweise nimmst du sowas wie den Windows Task Scheduler um dein Programm einmal am Morgen und einmal am Abend laufen zu lassen. Solltest du darauf bestehen das dein Python Script die ganze Zeit läuft, kannst du davon ausgehen, dass du nicht so oft wie möglich den Vergleich "rigthnow > night" machen musst. Zumal du ja die aktuelle Uhrzeit auch nicht in der while loop abfragst und sich daher das Ergebnis des Vergleichs nie wieder ändern wird.
Typischerweise würde man in dem While ein sleep einbauen, so das der while loop nur einmal pro Minute durchlaufen wird. (Vielleicht sogar noch weniger, das ist deine Designentscheidung). Außerdem solltest du das Hintergrundbild nur ändern, wenn es zum Umschalten kommt.

Ein minimales Programm könnte so aussehen (untested):

Code: Alles auswählen

import ctypes
import datetime
import time


def main():
    wallpaper = None
    daytime_start = datetime.time(8, 2, 0)
    daytime_end = datetime.time(19, 10, 0)

    while True:
        now = datetime.datetime.now().time()
        if now > daytime_start and now < daytime_end:
            # daylight
            wallpaper_new = "C:\\Users\\Arthur\\Desktop\\Hintergründe\\lest.jpg"
        else:
            # night time
            wallpaper_new = "C:\\Users\\Arthur\\Desktop\\Hintergründe\\lestabed.png"

        if wallpaper != wallpaper_new:
            # Change the wallpaper only on demand
            wallpaper = wallpaper_new
            ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper, 0)

        # slow done the loop
        time.sleep(1 * 60) 


if __name__ == '__main__':
    main()


Re: Warum laggt es

Verfasst: Donnerstag 13. Februar 2025, 01:24
von __blackjack__
Wenn man den Vergleich verkettet, wird es ein bisschen lesbarer und man muss auch `now` nicht als Namen haben, weil man den Aufruf direkt in die Bedingung schreiben kann.

Den Pfad zu den Bildern würde ich da nur einmal in den Quelltext schreiben. Sonst muss man den an zwei Stellen ändern, wenn man den mal ändern möchte.

Ungetestet:

Code: Alles auswählen

import ctypes
import time
from datetime import datetime as DateTime, time as Time
from pathlib import Path

WALLPAPERS_PATH = Path(R"C:\Users\Arthur\Desktop\Hintergründe")


def main():
    daytime_start = Time(8, 2)
    daytime_end = Time(19, 10)

    wallpaper_path = None
    while True:
        new_wallpaper_path = WALLPAPERS_PATH / (
            "lest.jpg"
            if daytime_start <= DateTime.now().time() < daytime_end
            else "lestabed.png"
        )
        if wallpaper_path != new_wallpaper_path:
            wallpaper_path = new_wallpaper_path
            ctypes.windll.user32.SystemParametersInfoW(
                0x0014, 0, str(wallpaper_path), 0
            )

        time.sleep(60)


if __name__ == "__main__":
    main()
Man könnte sich auch mal das `sched`-Modul aus der Standardbibliothek anschauen.

Re: Warum laggt es

Verfasst: Donnerstag 13. Februar 2025, 01:42
von imonbln
__blackjack__ hat geschrieben: Donnerstag 13. Februar 2025, 01:24 Wenn man den Vergleich verkettet, wird es ein bisschen lesbarer und man muss auch `now` nicht als Namen haben, weil man den Aufruf direkt in die Bedingung schreiben kann.
Für den Erfahrenden Python Entwickler sicher, aber ich fürchte das du einen Anfänger mit sowas nicht abholen wirst und es vielleicht sinnvoll ist diese Optimierung erst als zweiten schritt zu erklären.

Re: Warum laggt es

Verfasst: Donnerstag 13. Februar 2025, 10:07
von __blackjack__
@imonbln: Na das war doch der zweite Schritt. Den ersten hast Du gemacht. Wobei das mit verketteten Vergleichen im Tutorial vorkommt und ja aus der Mathematik bekannt ist.

Re: Warum laggt es

Verfasst: Donnerstag 13. Februar 2025, 17:48
von The_Freeed
vielen dank für die hilfe