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.
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 euro2
a dolar2
.
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.
Pracuji v oblasti vzdělávání dospělých pro jednu nadnárodní společnost. IT jsem vystudoval a mám jako koníčka. V Linuxové komunitě se pohybuji od roku 2006. Začal jsem na Madrivě a od roku 2010 jsem na Ubuntu ;-)