Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Jak psát Screenlety

Screenlety jsou takové gadgety, které se umísťují na plochu a zobrazují různé informace s možností manipulace. Můžeme mít na ploše hodiny, kalkulačku, kalendář, RSS, využití disků, procesoru, pamětí a spoustu dalších a dalších informací a my si povíme, jak si takový vlastní Screenlet napíšeme.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Základní informace o Screenletech

Pokud Screenlety znáte, můžete přejít až k nadpisu První Screenlet.

Jako na začátek bych chtěl upozornit, že k použití Screenletů je třeba mít zapnutý kompozitní okenní manažer Compiz. Bez této hlavní důležité věci vám Screenlety nepůjdou či nebudou pracovat správně. Dále už jen doporučím, že je lepší je provozovat pod grafickým prostředí Gnome.

Screenlety jsou psány v programovacím jazyce Python, při čtení tohoto seriálu byste měli tento jazyk alespoň minimálně ovládat.

Více se o Screenletech můžete dočíst na jejich domovské stránce (anglicky) a spoustu dalších Screenletů naleznete na gnome-look.org (anglicky).

Screenlety

Jak Screenlety nainstalovat

Jelikož jsou Screenlety obvykle v repositářích, nainstalují se velice jednoduše. Stačí provést následující příkaz (pro .deb distribuce) nebo v oblíbeném správci balíčků nalézt balíček screenlets a ten nainstalovat.

$ sudo aptitude install screenlets 

Po provedení instalace najdete Screenlety (tedy jejich manažer) v Ubuntu v menu Aplikace > Příslušenství >Screenlets. Zde je hlavni seznam Screenletů a nové nainstalujete jednoduše kliknutím na tlačítko Install nebo přetažením archivu nad seznam a potvrzením instalace. Dále si je zapnete pomocí zaškrtnutí check-boxu Start/Stop a aby se vám spouštěly automaticky po startu (je na mysli aktuálně vybraný Screenlet; Screenlety jako tento manažer se spouští automaticky po startu) tak zaškrtněte check-box Auto start on login.

Tímto vyhlašuji konec „nudného tlachání“ a jdeme konečně něco naprogramovat.

První Screenlet

#!/usr/bin/env python

import screenlets
from screenlets import DefaultMenuItem
import gobject
import time

class MyFirstScreenlet( screenlets.Screenlet ):

  # zakladni meta-info o screenletu
  __name__ = 'My First Screenlet' # nazev
  __version__ = '1.0' # verze
  __author__ = 'Michal Horejsek' # autor
  __desc__ = __doc__ # dokumentace; ponechame dokumentaci samotnych screenletu

  __timer = None # definujeme si timer pro update

  width = 200 # sirka
  height = 40 # vyska

  # konstrukcni funkce
  def __init__( self, **keyword_args ):
    screenlets.Screenlet.__init__( self, width=self.width, height=self.height, **keyword_args )

  # handler, ktery je zavolan, az kdyz je screenlet finalne inicializovan
  def on_init( self ):
    self.add_default_menuitems()

  # handler, ktery je zavolan, kdyz je screenlet namapovan
  def on_map( self ):
    if not self.__timer:
      self.__timer = gobject.timeout_add( 1000, self.update )
    self.update()

  # handler, ktery je zavolan, kdyz je screenlet odmapovan
  def on_unmap( self ):
    if self.__timer:
      gobject.source_remove( self.__timer )
      self.__timer = None

  # nase funkce update
  def update( self ):
    self.redraw_canvas()
    return True

  # zde vykreslujeme nas screenlet
  def on_draw( self, ctx ):
    if self.scale > 5:
      self.scale = 5
    ctx.save()
    ctx.scale( self.scale, self.scale )

    ctx.set_source_rgba( 1, 1, 1, 0.1 ) # nastaveni barvy (RGB a pruhlednost)
    self.draw_rectangle( ctx, 0, 0, self.width, self.height ) # nakresleni obdelinku jako pozadi

    foo = str( time.localtime()[3] ) + ':' + str( time.localtime()[4] ) + ':' + str( time.localtime()[5] )
    ctx.set_source_rgba( 1, 1, 1, 1 ) # nastaveni barvy (RGB a pruhlednost)
    self.draw_text( ctx, 'Prave je '+foo, 10, 10, 'FreeSans', 12, 200 ) # vypsani textu

    ctx.restore()

  # toto je dulezita funkce, bez ni bychom nemohli screenlet posouvat ani
  # vyvolavat nabidku pravym kliknutim
  def on_draw_shape(self, ctx):
    self.draw_rectangle(ctx, 0, 0, self.width, self.height)

# zde inicializujeme program a pridame do session screenletu
if __name__ == "__main__":
  import screenlets.session
  screenlets.session.create_session( MyFirstScreenlet )

Jistě nebude stačit takovéto jednoduché nahlédnutí a všechny handlery a funkce, které se v tomto příkladu objevují, si vysvětlíme podrobněji.

Nejdřív ale začneme s názvem. Název Screenletu musí být uveden tak, jak je to v ukázce, to znamená, že nejdřív náš název s příponou Screenlet, tedy v tomto případe MyFirstScreenlet (můj první Screenlet). Stejně tak i název souboru.

__init__

Funkce __init__ nám slouží jako konstrukční funkce, která se provádí úplně jako první. V této funkci se musí objevit volání konstrukční třídy samotných Screenletů, kde nastavíme základní atributy jako šířku a výšku. Dále se sem také píše nastavení Screenletů (ukážeme si v nějakém dalším díle) či různé inicializační proměnné podle potřeby.

on_init

Tento handler se volá jako první po úplné inicializaci Screenletu. Zde se například inicializují položky pro kontextovou nabídku. Většinou se tam píše jen řádek z ukázky, ale někdy potřebujeme přidat vlastní další položky (o tom později). Já v tomto handleru (u Screenletu InfoPanel) ještě volám inicializaci bufferů (o tom také později).

on_map a on_unmap

Tyto handlery se zavolají na začátku ( on_map) nebo na konci ( on_unmap) běhu Screenletu. Vhodné pro umístění timeru, který se nám stará o update (re-draw). Takto řešený update screenletu není jedinou správnou možností.

on_draw

Do tohoto handleru napíšeme všechno, co chceme, aby se provedlo při vykreslení Screenletu. V příštím díle si kreslení různých tvarů a textu ukážeme.

on_draw_shape

Handler on_draw_shape je velice důležitý, protože obstarává možnost kliknout pravým tlačítkem myši a vyvolat nabídku, kterou jsme si vytvořili v handleru on_init nebo také možnost pohybovat se Screenletem, když se nám zobrazí na obrazovce.

update

Na funkci update jsem nezapomněl, jen se nejedná o handler, který nutně patří ke Screenletům – název funkce si můžete zvolit jaký chcete. Voláme ji každou vteřinu (nastaveno v handleru on_map) a provede překreslení Screenletu.

Spouštění Screenletu

Tím, že napíšeme kód, samozřejmě nemáme vyhráno. Také musíme kód nějak spustit a ověřit, že to dělá to, co chceme. To provedeme tak, že kód umístíme do souboru (nejlépe s koncovkou .py) a ten poté spustíme následujícím příkazem za předpokladu, že soubor je umístěn na ploše a jmenuje se MyFirstScreen­let.py.

$ python ~/Plocha/MyFirstScreenlet.py 

A spuštěný Screenlet si můžete zkontrolovat podle následujícího obrázku. Měl by vypadat úplně stejně, až na čas samozřejmě, pokud jste nijak neexperimentovali.

Screenlety

Příště

Tímto máme náš první jednoduchý Screenlet, který zobrazuje pouze hodiny a překresluje se každou sekundu. Doporučuji, abyste se nebáli a trošku experimentovali a v příštím díle si předvedeme, jak se kreslí různé tvary a píše text.

Školení: Návrh a používání MySQL databáze

 

Naučte se používat jednu z nejrozšířenějších databází. Dozvíte se vše potřebné od návrhu až po samotné využití MySQL v projektech.

Školení pro všechny, kteří se chtějí naučit efektivně pracovat s MySQL nebo se v práci s touto databází zlepšit.

Přihláška a podrobné informace

Ohodnoťte jako ve škole:
Průměrná známka 2,88

Přehled názorů

nechci rejpat, ale...
D.A. Tiger 9. 9. 2009 00:53
Nový
nic proti
xurfa 9. 9. 2009 06:39
Nový
├ 
Re: nic proti
vks 9. 9. 2009 09:15
Nový
└ 
Re: nic proti
Ash 9. 9. 2009 09:53
Nový
 
└ 
Re: nic proti
JS 9. 9. 2009 15:02
Nový
Java
Lenin POWER! 9. 9. 2009 10:23
Nový
└ 
Re: Java
eee 9. 9. 2009 16:40
Nový
 
└ 
Re: Java
Lol Phirae 9. 9. 2009 17:18
Nový
 
 
└ 
Re: Java
xurfa 9. 9. 2009 18:56
Nový
 
 
 
└ 
Re: Java
Lol Phirae 10. 9. 2009 09:32
Nový
Conky
Starejbar 9. 9. 2009 13:20
Nový
└ 
Re: Conky
xurfa 9. 9. 2009 18:57
Nový
Supr
blech 9. 9. 2009 13:41
Nový
└ 
Re: Supr
. 9. 9. 2009 14:06
Nový
Chyba detekce Pythonu (nebo tak něco)
Mira 9. 9. 2009 18:55
Nový
└ 
Re: Chyba detekce Pythonu (nebo tak něco)
. 9. 9. 2009 19:39
Nový
konstrukcni funkce?
danfis 9. 9. 2009 20:44
Nový
├ 
Re: konstrukcni funkce?
Brbla 10. 9. 2009 00:14
Nový
└ 
Re: konstrukcni funkce?
Tabak 10. 9. 2009 00:23
Nový
pochopil jsem spravne?
koroptev 10. 9. 2009 10:05
Nový
├ 
Re: pochopil jsem spravne?
D.A. Tiger 10. 9. 2009 13:45
Nový
│
└ 
Re: pochopil jsem spravne?
Father Hurley 17. 9. 2009 01:40
Nový
└ 
Re: pochopil jsem spravne?
nhx 11. 9. 2009 18:53
Nový
zasadni problem
hendrix 19. 9. 2009 23:00
Nový
├ 
Re: zasadni problem
D.A. Tiger 20. 9. 2009 00:19
Nový
│
└ 
Re: zasadni problem
hendrix 21. 9. 2009 19:51
Nový
│
 
└ 
Re: zasadni problem
hendrix 21. 9. 2009 20:42
Nový
└ 
Re: zasadni problem
Michal Hořejšek 24. 9. 2009 07:15
Nový
 
└ 
Re: zasadni problem
hendrix 24. 9. 2009 17:34
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem