Warum laggt es

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
The_Freeed
User
Beiträge: 2
Registriert: Mittwoch 12. Februar 2025, 19:31

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
imonbln
User
Beiträge: 190
Registriert: Freitag 3. Dezember 2021, 17:07

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()

Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
imonbln
User
Beiträge: 190
Registriert: Freitag 3. Dezember 2021, 17:07

__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.
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
The_Freeed
User
Beiträge: 2
Registriert: Mittwoch 12. Februar 2025, 19:31

vielen dank für die hilfe
Antworten