[Python]Automatyczna zmiana tapet w GNOME
Co jakiś czas nudzą mnie ustawione tapety. Nie tylko mnie, jak sądze. Bo ileż można ciągle się na to samo patrzeć. Chciałem więc, aby za każdym uruchomieniem komputera zmieniała mi się tapeta. Tak miałem w KDE i była to świetna rzecz, bo mogłem sobie ustalić, że nawet co godzina będgzie mi się zmieniać. Teraz mam GNOME i tu nie ma takiej opcji w ogóle. Co za pech, no! Postanowiłem więc, że napiszę sobie taki mały skrypcik, co to mi będzie za każdym startem systemu ustawiał nową tapetkę. Tak też zrobiłem.
#!/usr/bin/python
#
# changewallpaper.py
#
# Marcin Pospiech, aka Walker, July 2007
#
# A Python's script to change your wallpaper to a random image from defined directory.
# Works only in GNOME!
#
# Under the terms of the GNU General Public License
#
import gconf, os, random, mimetypes
wallpapers_dir = "/home/walker/wyglad/desktopography"
wallpapers = []
for root, dirs, files in os.walk(wallpapers_dir):
for file in files:
mimetype = mimetypes.guess_type(file)[0]
if mimetype and mimetype.split('/')[0] == "image":
wallpapers.append(os.path.join(root,file))
if not wallpapers:
raise SystemExit, "Nie znaleziono zadnych obrazkow w %s" % (wallpapers_dir, )
client = gconf.client_get_default()
client.set_string("/desktop/gnome/background/picture_filename", random.choice(wallpapers))
client.set_string("/desktop/gnome/background/picture_options", "scaled")
Aby zainstalować:
- Ściągamy plik
- Otwieramy go jakimś edytorem tekstu i zamieniamy ścieżkę
/home/walker/wyglad/desktopography
na adres katalogu, w którym znajdują się nasze tapety. Zapisujemy plik. - Wchodzimy w System -> Preferencje -> Sesje -> Klikamy Nowy -> Wpisujemy nazwę -> Klikamy "przeglądaj" i zaznaczamy plik, który ściągneliśmy -> Klikamy OK, a następnie zamknij.
Możemy się już cieszyć automatycznym zmieniaczem tapetek. Bardzo mile widziane komentarze ;).
Napisane 30 czerwca 2007 o 20:27:30
W kategorii
Linux
|
Programowanie
|
Techblog
| 19 komentarzy »
Proszę bardzo. :p
1. if len(wallpapers) < 1 => if not wallpapers
2. wallpapers.append(os.path.join(wallpapers_dir,file)) tu jest błąd – łączysz nazwę pliku z wallpapers_dir a przecież plik może być w podkatalogu
3. wallpapers[random.randint(0, len(wallpapers)-1)] => random.choice(wallpapers)
Narazie będe zmieniał u siebi na komputerze :)
bq. 1. if len(wallpapers) < 1 => if not wallpapers
Ach te przyzwyczajenie z innych języków :). U siebie poprawiłem.
Masz rację, zapomniałem o tym. Masz może jakąś koncepcję, jak to napisać?
W tym wypadku zwracany jest <code>TypeError: list indices must be integers</code>.
Dzięki :)
2. tak:
for root, dirs, files in os.walk(wallpapers_dir): (...) wallpapers.append(os.path.join(dirs,file))
3. Nie wrzucaj tego z powrotem do [], po prostu daj random.choice(wallpapers)
2. wallpapers.append(os.path.join(root,file)) a nie dirs, bo wtedy sie miesza.
3. O tej opcji nie wiedziałem, dzięki :).
Poprawiony plik i wpis. Dzięki za wskazówki, mwi.
Z pomocą pygtk możnaby to jeszcze prościej napisać:
http://www.dami.pl/~mwi/changewallpaper.py
Hmm… po pierwsze usunąłeś import gconf i dalej nie idzie, a po drugie:
TypeError: GConfClient.set_string() argument 2 must be string, not list
Chcę to jeszcze jutro przepisać do Tkinter.
Poprawione. Piszę trochę na ślepo, bo nie mam gnome :) I co zamierzasz dać w gui?
Zapommniałeś o imporcie gconf. By the way, dlaczego się powtarzasz w każdej linii pisząc import zamiast oddzielić je przecinkiem? Mały skrypt, mało importowania.
W GUI zamierzam dać opcje podania lokalizacji z tapetami, plus ustawienie, czy mają byc skalowane, powiększane, wyśrodkowane, czy inaczej. Ewentualnie jeszcze coś. Oczywiście do jutra może mi przejśc ochota ;).
B o jestem grzecznym chłopcem. :P
Yes: import os import sys No: import sys, osZ http://www.python.org/dev/peps/pep-0008/: – Imports should usually be on separate lines, e.g.:
Też sobie napiszę, tylko w PyGTK. :>
Cholera. I trzeba będzie dać jakieś cache’owanie bo mnie zeżre to sprawdzanie typu po zawartości :p Są jeszcze bindingi komendy file(1) w pythonie, jakby co.
Dzięki. Dopiero zaczynam z Python’em, więc na pewno mi się przyda. Nawet zobacze jutro chyba do PyGTK, bo wydaje się prostszy od Tkinter.
Tak dużo plików?
Mógłbym prosić o wyjaśnienie?
Chodzi o to, że na każdym pliku program uruchamia gtk.gdk.pixbuf_get_file_info, który zeżera całą zawartość, analizuje i jeżeli nie da się załadować to wypluwa None. Tylko, że to trochę zajmuje, więc najlepiej byłoby przefiltrować pliki od razu po dodaniu katalogu w gui. Albo, jak mówię użyć file który działa jak w linuksie czyli zwraca typ pliku po wczytaniu kilku bajtów, mime jest po prostu trochę zwodnicze bo patrzy tylko na rozszerzenie.
No ale kto Ci będzie trzymał obrazki w jakichś dziwnych formatach, nie pasujących do image? A ten sposób opisany przez Ciebie rzeczywiście jest w tym zastosowaniu beznadziejny. To ma przecież tylko zmienić tapetkę ;).
Nie bądź taki mądry, jak użytkownik będzie miał 8 tapet i dwa zrzuty ekranu w formacie xwd to program będzie działał w 80% bo mimetypes zwróci image dla wszystkich plików. Więc jak już, to warto chociaż porównać z tym co gnome jest w stanie załadować, a nie z czymkolwiek :p
Ojej, spokojnie :). Sam powiedziałeś, że za długo trwa. Zresztą nie sądzę, aby użytkownik chciał zrzut ekranu na tapetę dawać. Ale tak, jak mówisz – można jeszcze porównać z tym, co jest w stanie załadować, czyli zrobic listę z rozszerzeniami, ewentualnie mimetype’ami.
Ja kiedyś miałem prosty skrypcik w szelu, co zmieniał tapetę wg. daty. Bardziej uniwersalnym rozwiązaniem byłoby fallbackowanie do jakiegoś niezależnego zmieniacza tapet, jak np. polski habak.
A o czymś takim nie słyszałem. Jest jeszcze rozwijane?
Nie wiem w sumie. Jest kilka różnych takich — Esetroot, habak… tyle że one chyba korzystają tylko z natywnych wywołań X11, i GNOME mógłby podmieniać tapetę, gdyby swoją ładował po habaku. Może gdyby w GNOME wyłączyć tapetę…