kosmass_zt 17.11.2010 14:30

Tips & tricksАвтоматическая смена обоев в Openbox

Недавно решил опробовать Openbox. Пару часов гугления и правки конфигов - и на меня смотрит мой новый рабочий стол.
Отличная скорость работы, ничего лишнего. Казалось бы, что еще нужно для счастья?

Эврика! Если обоина держится на столе больше 15 минут - меня начинает одолевать невыносимая скука.
Исправить ситуацию мне помогла программа feh и начальные познания в python.

Приступим)

У меня установлена Ubuntu 10.04, а openbox - вторым WM.

Для начала сделаем так:
1
apt-get install feh



Потом в папку ~/.config/openbox/ закидываем наш скрипт, который можно назвать например setwallpaper.py

В скрипт автозагрузки ~/.config/openbox/autostart.sh добавляем строку

1
~/.config/openbox/setwallpaper.py



Не забываем сделать оба скрипта исполняемыми.
Теперь самое интересное.

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import random
import time
import datetime
default_directory = "~/.config/openbox/";
#Проверяем, запускался ли скрипт и задана ли директория для считывания списка картинок. Если файл не пустой - работаем. Если нет - задаём папку и работаем.
last_dir_file = open(default_directory+"feh_walls.lst", "r");
last_file = last_dir_file.read();
last_file = last_file.rstrip();
last_dir_file.close()
if last_file == "":
images_directory = raw_input("Введите путь у папке:\n");
last_dir_file = open(default_directory+"feh_walls.lst", "w");
last_dir_file.write(images_directory);
last_dir_file.close();
else:
images_directory = last_file;
last_dir_file.close();
#В заданной папке сортируем файли и забираем только нужные в массив.
images_list = os.listdir(images_directory);
images = filter(lambda x: x.endswith('.jpg'), images_list);
im_ln = len(images);

#Считываем интервал смены изображений, если он не указан - спрашиваем.
last_interval = open(default_directory+"feh_interval.int", "r");
interval = last_interval.read();
interval = interval.rstrip();
last_interval.close();
if interval != "":
interval = interval;
else:
interval = raw_input("Введите интервал смены обоев в секундах:\n")
last_interval = open(default_directory+"feh_interval.int", "w");
last_interval.write(interval);
last_interval.close();
#Собственно, меняем обои и пишем каждую смену обоев в лог - на всякий случай
i = 0;
while i <= im_ln:
curr_image = random.randint(1,im_ln-1);
os.system ("echo 'Changing wallpaper to "+images_directory+images<curr_image>+". Date of change:"+str(datetime.datetime.now())+"' >> ~/.config/openbox/change.log")
os.system ("feh --bg-scale "+images_directory+images</curr_image><curr_image>+" && sleep "+interval);
if i == im_ln:
i = 1;
i += 1;

</curr_image>



В принципе, такой вариант меня вполне устраивает.
Единственный минус - если в имени папки с картинками есть пробел - ничего не заработает. Придумаю, как побороть - поправлю.
Замечания и критика приветствуется :)

UPD: Забыл совсем. Нужно сделать еще так:
1
touch ~/.config/openbox/feh_walls.lst ~/.config/openbox/feh_interval.int



Тэги: OpenBox python ubuntu
+ 4 -
Похожие Поделиться

mhspace 17.11.2010 14:43 #
openbox - вторым DE.

Эх...
kosmass_zt 17.11.2010 14:46 #
Но чувствую, что скоро станет единственным)
kosmass_zt 17.11.2010 14:49 #
Упс ;)
derfenix 17.11.2010 17:03 #
Побуду немножко занудой и скажу, что всё то же самое можно было сделать на bash, намного короче и проще, плюс, без проблем с пробелами. :)
kosmass_zt 17.11.2010 18:15 #
Ну надо же было помучаться)
За альтернативный вариант - огромное спасибо)
freefd 17.11.2010 17:38 #
while true; do feh --bg-scale "$(find ~/.wallpaper -name *.jpg | shuf -n 1)"; sleep 15m; done &
derfenix 17.11.2010 17:44 #
тут вот, как раз, имена с пробелами - будут проблемой. но в целом - примерно то, что я и имел в виду :) Имхо этот вариант даже лучше, а проблему пробелов решить заменой этих пробелов в именах на _
freefd 17.11.2010 17:45 #
"" скрасят проблемы в именах :)
derfenix 17.11.2010 18:19 #
А где ты там кавычки поставишь? :)
По-моему, нормально, без геммора с пробелами только while read dir; do bla-bla "$dir"; .... работает.. а этими find и прочими вечно проблемы.
freefd 17.11.2010 20:20 #
Дык там и написано "$(find ~/.wallpaper -name *.jpg | shuf -n 1)"
Daria 18.11.2010 07:08 #
"$(find . -iname '*.jpg' | shuf -n 1)"
freefd 18.11.2010 08:29 #
Предпочитаю расширения файлов держать в нижнем регистре :)
Daria 18.11.2010 14:41 #
одинарные кавычки всё равно нужны :)
freefd 18.11.2010 14:46 #
fd@workstation:~$ find /home/fd/Documents/ -name *.jpg
/home/fd/Documents/iptv/sxema_dib.jpg
/home/fd/Documents/iptv/iptv.jpg
/home/fd/Documents/iptv/amino125.jpg
/home/fd/Documents/wallpaper2.jpg
/home/fd/Documents/Raining.jpg
/home/fd/Documents/osi.jpg
/home/fd/Documents/Fifty_Percent_Grey.jpg
/home/fd/Documents/wallpaper1.jpg


Что я делаю не так? :)
Daria 18.11.2010 16:25 #
до сих пор используешь андерлайн вместо пробела.
freefd 18.11.2010 16:57 #
fd@workstation:~$ find ~/Documents -name F*.jpg
/home/fd/Documents/Fifty Percent Grey.jpg


feh --bg-scale "$(find ~/Documents -name F*.jpg | shuf -n 1)"/quote>

Всё великолепно отработало.
Daria 18.11.2010 18:18 #
если F*.jpg не квотить, то бэш заменит это регулярное выражение ещё до того, как скормит его find.

попробуй создать файл Fail.jpg в той же директории, откуда ты выполняешь скрипт, а потом запустить find ~/Documents -name F*.jpg
freefd 18.11.2010 18:22 #
Леди, мне мерещится, мы всё же проверяем пробелы в именах файлов или знание регулярных выражений?

Я показал на примере с файлом, имеющем пробелы в имени. F* - специально чтобы поймать именно файл с пробеламы в имени.
Daria 18.11.2010 19:08 #
пробелы пробелами, а регулярное выражение стоит заквотить в одинарные кавычки, чтоб можно было обернуть двойными кавычками подстановку команд, чтобы можно было не боятся пробелов в результате оной.

и вообще, я королева бензоколонки.
DobrijZmej 18.11.2010 18:41 #
1)
root@comp2:~/Документы$ find ./ -name *.doc
find: paths must precede expression: #11.doc
Usage: find <-H> <-L> <-P> <-Olevel> <-D help|tree|search|stat|rates|opt|exec>
2)
root@comp:~/Документы$ find ./ -name "*.doc"
./рефераты/Быт древних словян.doc
./рефераты/Численность населения Украины.doc
./рефераты/титульный лист (реферат экология).doc
...