FLIPPER - random wallpaper changer

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Hab vor kurzem die Idee gehabt ein Script zu schreiben, welches mir ermöglicht Bilder von einer Wallpaper Website als mein Desktop Hintergrund zu setzen.
Hab es nun geschrieben und eine Seite ist schon implementiert. Die Bilderlinks wurden mit BeautifulSoup gefiltert. Das Script, welches die Links ermittelt, ist nicht mitinbegriffen, da es einfach zu lange braucht, als das sich das jemand antun würde.

Es wird die Bildschirmgröße ermittelt und nur Bilder mit passender Auflösung verwendet.
Es lässt sich zurzeit eine Kategorie einstellen oder alle vorhandenen.
Der Delay ist die Zeit bis ein neuer Desktophintergrund eingestellt werden soll in Sekunden.

Ein Bilder wird dann mit random.choice aus der List mit allen Links gepickt und als Hintergrundbild gesetzt.

https://github.com/Dami123/FLIPPER-rand ... hanger.git
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Dami123,
schau Dir mal PEP8 an. Wenn man sich an eine bestimmte Namenskonvention hält, erhöht es die Lesbarkeit, andere finden sich schneller in Deinem Code zurecht und man weißt auch, dass eine KONSTANTE konstant bleiben sollte.
Konstanten gehören an den Anfang eines Programms, z.B. »categories«, diese Liste hast Du jetzt zweimal, einmal als Kommentar und einmal in einer Funktion.
»os.chdir« in einem Programm ist fast nie eine gute Idee, es setzt bei Dir zusätzlich voraus, dass das Programm aus einem bestimmten Verzeichnis aus aufgerufen wurde. »__file__« hilft Dir, das Verzeichnis relativ zum Skript zu finden.
»setWallpaper« wird rekursiv aufgerufen, wenn z.B. keine Internetverbindung besteht, steigt das Programm damit nach einer Weile mit einem »RuntimeError« aus.
Einfach so irgendwo eine Datei hinzuschreiben ist auch unschön, dazu gibt es das TEMP-Verzeichnis.
Was hindert Dich »LinkList« als Parameter zu übergeben?
»getLinks_wallpaperweb« macht in beiden Zweigen des »if« fast das Gleiche; das schreit förmlich nach einer weiteren Funktion.
Du kennst doch bereits with mit open. Statt »re.findall« tut es hier ein einfaches »in«. Auch hier sollte »LinkList« keine globale Variable sein.
Was soll das -1 bei »sleep«?
Es fehlt ein »if __name__=='__main__'«.

Grüße
Sirius
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Danke für dein Feedback :)
Hab gleich einiges umgesetzt und siehe da der code ist viel besser lesbar.

-Zu __file__ hab ich noch keine gute Doku gefunden - "try-except" eingebaut
-TEMP eingebaut, jedoch nicht "tempfile.TemporaryFile" verwendet, da sonst immer wieder gelöscht werden muss um den PC nicht voll zu spammen
-"if" Wiederholung gelöst durch neue Kategorie Auswahl
-statt "re.findall" "in" eingebaut

"LinkList" wird später mit weiteren Links von anderen Seiten gefüttert und da passt das Konstrukt der "while"-Schleife ganz gut.
Das -1 beim "sleep" ist für die auftretende Download- und Hintergrundeinstellungszeit da.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@Dami123: nimm zum Zusammensetzen von Dateien »os.path.join«.
Nochmal zum »chdir«; ein Beispiel: Wenn Du in irgendeinem anderen Programm denkst, »setWallpaper« könnte ich auch gut gebrauchen, und importierst FLIPPER als Modul:

Code: Alles auswählen

import FLIPPER
…
FLIPPER.setWallpaper("http://somewhere/wallpaper.jpg")
…
dann wunderst Du Dich, dass im Rest des Programms plötzlich seltsame Dinge passieren, weil Du durch den Import den globalen Zustand (das aktuelle Verzeichnis) geändert hast. Das ändern von globalen Zuständen sollte man immer vermeiden (das ist eine 99.9% Regel oder einmal-in-hundert-Jahren).
Also statt »os.chdir«:

Code: Alles auswählen

LINK_LIST_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)),'links')
…
with open(os.path.join(LINK_LIST_PATH, categorie+'.txt')) as links:
    …
Bei with-open braucht man kein »close« mehr.
schau Dir mal PEP8 an.
»setWallpaper« wird rekursiv aufgerufen.
Was passiert bei »delay=0«?
In »getLinks_wallpaperweb« wird ohne Not auf drei globale Variablen zugegriffen!
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

delay=0 mit -1 -> verstanden :wink:
Als ich verstanden hab was rekursiv aufgerufen bedeutet hab ich es gleich geändert. "urllib.retrieve()" vereinfacht das ganze.
http://www.python-kurs.eu/rekursive_funktionen.php
Statt "os.chdir()" nun "os.path.join()" eingebaut.

Alle globalen Variablen werden vermieden.
Zweite Seite eingebaut. Jedoch sind die Seiten noch nicht synchronisiert, die Folge -> eine zusätzliche if-Abfrage.

Danke nochmal für die Verbesserungstipps :)

FLIPPER:
https://github.com/Dami123/FLIPPER-rand ... hanger.git
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hmm, mit der Erklärung des Python-Kurses den du da verlinkt hast bin ich nur mäßig begeistert. Dort wird gesagt dass eine rekursive Funktion terminieren muss (muss sie im allgemeinen gar nicht, man kann durchaus auch Schleifen mit Rekursiven Funktionen bauen, solange sie Endrekursiv sind ist das im Allgemeinen kein Problem) und sowas wie das Rekursionslimit in Python (womit wir vom allgemeinen beim Speziellen wären) wird gar nicht erwähnt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Ja das könnte sein.
Jedoch hab ich dadurch verstanden, dass wiederholende Funktionen möglicht rekursivlos programmiert werden sollten.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Update
Hab eine GUI gebastelt und eine weitere Seite hinzugefügt.
Eine provisorische Bild Verkleinerung, wenn ein Bild größer als die eigene Auflösung ist, wurde auch eingebaut.
Die gescannten Seiten sind synchronisiert sprich so gespeichert, dass eine Funktion die importieren kann.

Da ein paar Module benötigt wurden, die nicht im Standardlieferumfang von Python liegen, hab ich eine .exe mit cx_freeze erstellt.

https://github.com/Dami123/FLIPPER-rand ... perChanger
Antworten