Jak si napsat vlastní widget pro SuperKaramba

9. 3. 2009 19:42 (aktualizováno) Kamil Pošvic

Již nějaký čas si hraji s myšlenkou na vylepšení své plochy. Mám zde aktuální komiks s Garfieldem, předpověď počasí pro naši oblast i analogové hodiny. Další takovou věcí, kterou často kontroluji je vývoj kurzu EURA a DOLARU. Tak proč to nesledovat přímo na ploše?

1. Podklady

Rozhodl jsem se, že si proto napíšu vlastní widget. Vycházel jsem z toho, že ČNB publikuje na svých stránkách denní kurzový lístek ve formě TXT.

Zde si můžete prohlídnout soubor s aktuálním kurzovním lístkem ČNB.
To co nás zajímá je řádek 0 kde je datum, řádek 7 kde je EURO a řádek 35 kde je DOLAR.

Když zavoláme stejnou adresu s parametrem „?date=DD.MM.RRRR“ dostaneme kurzovní lístek pro daný den (v případě, že se jedná o nepracovní den, tak lístek z předchozího pracovního dne)

Takže podklady už máme, teď se dáme do programování.

Widgety pro SuperKarambu jsou v Pythonu. Snadno se dá z již napsaných widgetů naučit co a jak. Tento způsob jsem využil i já a prostudoval pár již funkčních widgetů. Pro úspěšnou funkci budeme potřebovat soubor .py se samotným programem a soubor .theme s nastavením a informacemi pro zaváděcí program. Dále jsem zjistil, že pro moje potřeby budu potřebovat napsat 2 funkce. Inicializační funkci initWidget a obnovovací funkci  widgetUpdated.

Připravil jsem si obrázek který použiji jako pozadí našeho widgetu. Vše co se nebude měnit jsem již na něj umístil.

skin.png

Teď ještě ikonky které se budou měnit (růst, pokles, stagnace).

2. Zaváděcí část

Pak jsem se vrhnul na napsání zaváděcího programu CNBinfo.theme

karamba x=10 y=10 bottom=true w=210 h=122 locked=false interval=1000 defautfont font="Sans" fontsize=9 color=220,220,220 shadow=0 IMAGE X=0 Y=0 PATH="skin.png"

První řádek je zpráva pro SuperKarambu. Defaultní zobrazení na pozici 10:10, rozměry 210×122, neuzamčená pozice, doba obnovování 1 sekunda (údaj je v milisekundách)
Druhý řádek nastaví font, velikost a barvu.
Třetí řádek je obrázek pozadí. Na nulový bod načteme náš obrázek.

3. Program

Teď už k vlastnímu programu CNBinfo.py

3.1. Inicializační funkce

def initWidget(widget):     global kurzy, icon_eur, icon_dol     kurzy = karamba.createText(widget, 80, 27, 188, 60, "")     karamba.changeTextSize(widget, kurzy, 29)     icon_eur = karamba.createImage(widget, 175, 33, "")     icon_dol = karamba.createImage(widget, 175, 68, "")

1. Nastavíme si proměnné které budeme volat i z dalších funkcí
2. Vytvoříme si textové pole v rámci našeho widgetu na pozici x=80, y=27 a rozměrech 188×60
3. Změníme velikost písma na 29 (optimální pro naší velikost)
4. Vytvoříme si prázdný obrázek na pozici 175,33 – šipka značící růst, pokles, stagnaci eura
5. Vytvoříme si prázdný obrázek na pozici 175,68 – šipka značící růst, pokles, stagnaci dolaru

Hotovo, tím jsme inicializační část napsali. Máme vše co pro náš program budeme aktivně potřebovat.

3.2. Aktualizační funkce

def widgetUpdated(widget):     karamba.changeInterval(widget, 3600000)     url = "http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt"

1. změníme interval aktualizace na 1 hodu (v milisekundách)
2. adresa aktuálního kurzovního lístku

    opener1 = urllib2.build_opener()     page1 = opener1.open(url)     data = page1.read()     radky = data.split(chr(0x0A))

1. nastavíme si pole na čtení z webu
2. otevřeme adresu pro čtení
3. načte celý soubor do promene  data

4. rozdělíme si soubor na jednotlivé řádky

    euro = radky[7].split(chr(0x7C))[4]     dolar = radky[35].split(chr(0x7C))[4]     datum = radky[0].split(chr(0x20))[0]

Data na řádce jsou rozdělené znakem 0×7C, potřebný údaj je 5-tý v řadě
1. na řádce 7 je EURO
2. na řádce 35 je DOLAR
3. na řádce 0 je datum

    datum = datetime.date(int(datum[6:]), int(datum[3:5]), int(datum[:2]))-datetime.timedelta(days=1)     url2 = 'http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt?date=' + datum.strftime("%d.%m.%Y")

1. převedeme datum z řetězce na užitečnější formát a odečteme 1 den
2. nastavíme adresu na kurzovní lístek předchozího pracovního dne

    page2 = opener1.open(url2)     data = page2.read()     radky = data.split(chr(0x0A))     euro2 = radky[7].split(chr(0x7C))[4]     dolar2 = radky[35].split(chr(0x7C))[4]

Vše opakujeme pro starý kurzovní lístek a jeho hodnoty si uložíme do euro2dolar2.

    vystup = euro + '\n' + dolar     karamba.changeText(widget, kurzy, vystup)

1. Připravíme si data na výstup – EURO a na druhé řádce DOLAR.
2. Změníme text ve widgetu

    if (euro>euro2):         karamba.setImagePath(widget,icon_eur,"icon/up_24.png")     elif (euro==euro2):         karamba.setImagePath(widget,icon_eur,"icon/back_24.png")     else:         karamba.setImagePath(widget,icon_eur,"icon/down_24.png")     if (dolar>dolar2):         karamba.setImagePath(widget,icon_dol,"icon/up_24.png")     elif (dolar==dolar2):         karamba.setImagePath(widget,icon_dol,"icon/back_24.png")     else:         karamba.setImagePath(widget,icon_dol,"icon/down_24.png")

Porovnáme včerejší hodnoty s dnešními a podle toho namalujeme do našeho prázdného obrázku šipku.

    karamba.redrawWidget(widget)

A na závěr celý widget zaktualizujeme, aby se projevili naše změny.

Tak doufám, že Vám tenhle článek bude alespoň trošku přínosem. Použil jsem jen základní věci a netvrdím, že jsem v tom profesionál nebo že je to nejelegantnější řešení, jen jsem se snažil jednoduše ukázat, jak snadno si člověk může upravit svoji plochu.

Celý program jsem připravil zde. V textu jsou kompletní popisky každé řádky.

Sdílet