Форум сайта python.su
Мой первый скрипт на python.
Хотелось бы услышать конструктивную критику. Какие у меня принципиальные ошибки, если таковые имеются. Ну и вообще какие недочеты.
О скрипте. Скачивает картинку с сайта www.wallpapperlinux.com и устанавливает в качестве обоины рабочего стола.
Пока, работает только в среде Gnome. Тестировал на Debian Squeeze и Ubuntu Karmic
Дополнительные пояснения. Опытным путем было установленно что почти все (а может и все) картинки хранятся на сайте по адресу:
http://www.wallpaperlinux.com/main.php?g2_view=core.DownloadItem&g2_itemId= ANY_NUMBER
, где изменяется только парамет g2_itemId. Диапазон значений примерно от 0 до 7000.
Так Хранятся не только сами картинки, но и превьюшки. Логику значений цифр для превьюшек и полных картинок вычислить не удалось, поэтому решил действовать другими методами.
#!/usr/bin/python
# coding: utf-8
import urllib2
import random
import Image
import StringIO
import os
import subprocess
MAX_CONNECT_ATTEMPT = 100 #максимальное количество попыток соединения с хостом
class WallPapper:
def __init__(self):
self.url = "http://www.wallpaperlinux.com/main.php?g2_view=core.DownloadItem&g2_itemId=" #основной урл до обоины. Не хватает только рандомного числа
self.error_url_counter = 0
def get_url(self):
"""отдает урл до изображения"""
self.rand = str(int(random.random()*7000)) #rand потом будет использоваться в имени файла. 7000 - потому что id-шники разбросаны примерно в этом диапазоне
return self.url + self.rand
def image_loader(self):
"""пытается загрузить изображение. return StringIO object"""
flag = False
while not flag: # пытаемся загрузить указанный урл столько раз, сколько указано в MAX_CONNECT_ATTEMPT
try:
url = self.get_url()
print url
str_im = urllib2.urlopen(url);
print "url - OK"
flag = True
except IOError:
print "url - ERROR"
self.error_url_counter +=1
if self.error_url_counter > MAX_CONNECT_ATTEMPT: #чтобы не уходить в бесконечный цикл, если нет соединения с интернетом, то завершаем программу"""
print 'network problem or host is unavailable'
return False
return StringIO.StringIO(str_im.read())
def image_saver(self):
"""сохраняет изображение, if image.size > 1024"""
#пытаемся открыть изображение из объекта StringIO, пока не будут удовлетворены все требования (size>1024, ...)
flag = False
while not flag:
try:
image = self.image_loader()
if not image: return False # если урл адрес так и не был открыт, то прекращаем работу программы
image = Image.open(image)
if image.size > (1024,0): flag = True
except IOError:
print "не удалось открыть изображение"
path = os.getcwd()
os.chdir(path)
try:
os.mkdir('images')
except OSError:
os.chdir('images')
image_name = self.rand + '_img.jpg'
print image_name
image.save(image_name)
# эта стока добавляет скачанную обоину на рабочий стол
# строка для гном. Можно использовать альтернативу, например "feh -bg что то там"
# TODO кроссплатформенность
cmd = "gconftool-2 --type string --set /desktop/gnome/background/picture_filename " + os.getcwd() + "/" + image_name
print cmd
subprocess.Popen(cmd, shell = True)
picture=WallPapper()
picture.image_saver()
Отредактировано (Янв. 6, 2011 00:10:07)
Офлайн
Денис, ты? :))))
Офлайн
igor.kaistнет не я.
Денис, ты? :))))
Офлайн
RMNX.rcСорри, вырвалось…. Нескучные обои, ubuntu…. :)
нет не я.
То бишь это не Денис :)
Офлайн
Шутку понял. Но всеж таки Debian. (Ubuntu на работе).
Офлайн
RMNX.rcДля начала читайте здесь http://www.python.org/dev/peps/pep-0008/ и здесь: http://www.artima.com/weblogs/viewpost.jsp?thread=4829
Хотелось бы услышать конструктивную критику.
Отредактировано (Янв. 7, 2011 20:15:22)
Офлайн