16 Nisan 2010 Cuma

biraz kül biraz duman - python gtk ekran koruyucu

uzun zamandır blog'umda kod paylaşmadığımı fark ediyorum. sanmayın ki bu adam kendini edebiyata şiire vs. verdi programlamayı boşladı. haşa. ama her sınav dönemi olduğu gibi bu sınav dönemi de şeytanım bol, ilham perilerim vızır vızır uçuşuyor. python'da aşağı yukarı her arayüz sistemiyle kod yazmışlığım çalışmışlığım var. microsoft'un ironpython'unu hariç tutuyorum. çünkü onlar zaten bu dilin adını bile kullanmaya tenezzül etmiyorlar. neyse efen'im. her birinin avantajları ve dezavantajları söz konusu haliyle. qt çok sağlam olmasına karşın çetrefilli, tkinter çok çok kolay ama zayıf ve bir çok şeyle entegrasyonu zor. uzun bir süredir üzerinde çalıştığım gtk'nın ise şu ana kadar en sevdiğim seçenek olduğunu söylemem lazım.

bir süredir yalnızca gtk ile python arayüz çalışıyorum. her ne kadar glade adlı kullanışlı bir tasarım programı olsa da, şu aşamada bir arayüz düzenleyici ile çalışmayı tercih etmiyorum. arayüz konusuna çok eğilirsem, bir araç olması gereken arayüz kısmının beni kısıtlar duruma geldiğini farkediyorum. bu sebeple bir düzenleyici kullanmadan, metin editörümle kodlar ile widget'ler oluşturup penceremi çizdiriyorum. ve böylesi çok daha hoşuma gidiyor.

evet, dediğim gibi, bu hafta şiir ya da köşe yazısı yok. kod var. çalışabilmesi için sisteminizde python, pygtk, glib olması gerekiyor.

birazkulbirazduman.py
#!/usr/bin/python
#-*- coding: utf-8 -*-

import gtk
import random
import glib

ITERASYON = 25
BEKLEME = 10

class PyApp(gtk.Window): 
    def __init__(self):
        super(PyApp, self).__init__()
        self.connect("destroy", gtk.main_quit)
        self.fullscreen()
        
        self.alan = gtk.DrawingArea()
        self.alan.connect("expose-event", self.expose)
        self.add(self.alan)
        
        glib.timeout_add(1000*BEKLEME, self.on_timer)

        self.show_all()
    
    def on_timer(self):
        self.alan.queue_draw()
        return True
    
    def expose(self, widget, event):
        ekx = self.allocation.width
        eky = self.allocation.height
        cr = widget.window.cairo_create()
        
        bg = random.random()
        cr.set_source_rgba(bg, bg, bg, 1)
        cr.paint()
        
        for i in range (0, ITERASYON):
            ton = random.random()
            cr.set_source_rgba(ton, ton, ton, random.random())
            en = random.randint(0, int(ekx/100))
            cr.set_line_width(en)
            cr.move_to (-1*en, random.randint(0, eky))
            cr.line_to (random.randint(0, ekx), -1*en)
            cr.move_to (random.randint(0, ekx), eky + en)
            cr.line_to (ekx + en, random.randint(0, eky))
            cr.stroke()
        cr.fill()


PyApp()
gtk.main()


çok kısa bir sürede hazırladığım bir program. en başta sırf denemeler yapmak için oluşturmuştum dosyayı. ancak eklemeler ve düzenlemeler yapınca bir ekran koruyucuya dönüştü. şu anda problemsiz çalışıyor. sıcağı sıcağına paylaşmak istedim. bir çok ekran koruyudaki temel espri rastgeleliktir. bu uygulamada da sonuna kadar randomizasyon var. ekrana değişik renklerde ve kalınlıkta çizgiler belli bir düzen içerisinde fakat rastgele çizdiriliyor. dinamik olarak belli aralıklarla da ekran yenileniyor.

fakat gnome ekran koruyucu standartlarına getirmek için biraz daha üzerinde çalışmam lazım. bir de basit kurulum betiği yazınca iş tamam olacak. yerleşik ekran koruyucu uygulamaların tamamına yakını (hatta gördüğüm kadarıyla tamamı) c++ ile yazılmış uygulamalar. belki bu yüzden biraz sıkıntılı olabilir işim. gnome ekran koruyucu sistemi şöyle çalışıyor. bir tane .desktop uzantılı başlatıcı dosyası dosyası oluşturup /usr/share/applications/screensavers dizinine atıyorsunuz. bu dosya hangi uygulamanın çalışacağını ve bir kaç ayrıntı bilgiyi tutuyor. çalışan asıl dosyayı da /usr/bin dizinine koplayamanız gerekiyor.

birazkulbirazduman.desktop
[Desktop Entry]
Encoding=UTF-8
Name=Biraz Kül Biraz Duman
Comment=Eye-friendly grayscale random lines (Mustafa Yılmaz aka apshalasha).
TryExec=birazkulbirazduman.py
Exec=birazkulbirazduman.py -root
StartupNotify=false
Terminal=false
Type=Application
Categories=Screensaver;
OnlyShowIn=GNOME;

bir ekran koruyucunun başlatıcı dosyası işte bu şekilde oluyor. kısa açıklamalar ve çalışan uygulamasına referans dışında pek bir şey yok.

install.sh
#!/bin/sh
cp birazkulbirazduman.py /usr/bin/birazkulbirazduman.py
cp birazkulbirazduman.desktop /usr/share/applications/screensavers/birazkulbirazduman.desktop

kurulum betiği dediğim şey de çok abartılacak bir şey değil. hemen göstereyim. o da işte yukarıdaki şekilde hazırlanacak .sh uzantılı bir dosya olacak. tabi ki ekran koruyucumuzu kurabilmesi için yönetici haklarıyla çalıştırılması gerek. sudo kurulum.sh gibi.

bir basit ekran koruyucu mevzusu üzerinde epeyce şeyden bahsetmiş olduğumu farkettim. küçük çapta bir manas destanı ortaya çıkmış. uzun zamandır blogda programlama yazmaya yazmaya şişmişim galiba. neyse.

2 yorum: