AutoIt3: Despre GUI-uri, cu calm (V)


Continuăm, desigur, explorarea interfeţelor ce se pot realiza cu AutoIt3. Şi pentru a face lucrurile tot mai interesante vom vedea cum putem face o webaplicaţie care să folosească API-ul “secret” al Google pentru vreme (vedeţi articolul de acum câteva zile). Veţi vedea cum în nici o sută de linii de cod vom putea să aflăm vremea, via Google, şi să o afişăm într-un GUI. Şi ca să introducem un control nou, am apelat la ListView. Vedeţi mai jos în stânga o listă în care am trecut câteva localităţi. Se pot face oricâte coloane (eu am pus doar două, localitate şi judeţ). Cu un click pe o localitate, informaţiile din dreapta se vor schimba automat, luând datele de pe internet.

imagine

Evident, nu este genul de aplicaţie pe care să o comercializaţi :) . E din nou didactică. O aplicaţie adevărată ar fi permis utilizatorului să îşi “construiască” lista, ar da mesaje de eroare când e rulată offline, ar face cache la date, să nu le ia online de fiecare dată. Doar că atunci codul ar fi devenit dublu. Rămânem deci la esenţial şi vedem acum direct codul. Apoi vin şi explicaţiile.

[PHP]#NoTrayIcon
#include <array.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Local $orase[11],$temp[5],$zile[5],$prognoza[5],$img[5]

$hGUI=GUICreate("CNet.ro – Temperaturi",800,250)
$listview = GUICtrlCreateListView("Localitate | Judeţ", 10, 10, 160, 230)
$orase[1] = GUICtrlCreateListViewItem("Cluj-Napoca | Cluj", $listview)
$orase[2] = GUICtrlCreateListViewItem("Sibiu | Sibiu", $listview)
$orase[3] = GUICtrlCreateListViewItem("Oradea | Bihor", $listview)
$orase[4] = GUICtrlCreateListViewItem("Constanţa | Constanţa", $listview)
$orase[5] = GUICtrlCreateListViewItem("Baia Mare | Maramureş", $listview)
$orase[6] = GUICtrlCreateListViewItem("Iaşi | Iaşi", $listview)
$orase[7] = GUICtrlCreateListViewItem("Braşov | Braşov", $listview)
$orase[8] = GUICtrlCreateListViewItem("Lugoj | Timişoara", $listview)
$orase[9] = GUICtrlCreateListViewItem("Craiova | Dolj", $listview)
$orase[10] = GUICtrlCreateListViewItem("Deva | Hunedoara", $listview)
$oras_nume = GUICtrlCreateLabel("", 200, 10, 400, 20)
GUICtrlSetFont(-1, 12, 800, 0)
$oras_stare = GUICtrlCreateLabel("alegeţi o localitate din stânga", 200, 40, 200, 20)
GUICtrlSetFont(-1, 10, 400, 0)
$oras_temperatura = GUICtrlCreateLabel("", 200, 60, 200, 20)
GUICtrlSetFont(-1, 10, 400, 0)
$oras_umiditate = GUICtrlCreateLabel("", 200, 80, 200, 20)
GUICtrlSetFont(-1, 10, 400, 0)
$oras_vant = GUICtrlCreateLabel("", 200, 100, 200, 20)
GUICtrlSetFont(-1, 10, 400, 0)
For $i=1 To 4
$zile[$i] = GUICtrlCreateLabel("", 200+($i-1)*150, 130, 400, 20)
GUICtrlSetFont(-1, 9, 800, 0)
$temp[$i] = GUICtrlCreateLabel("", 200+($i-1)*150, 150, 400, 20)
GUICtrlSetFont(-1, 9, 400, 0)
$prognoza[$i] = GUICtrlCreateLabel("", 200+($i-1)*150, 170, 400, 20)
GUICtrlSetFont(-1, 9, 400, 0)
$img[$i] = GUICtrlCreatePic("", 200+($i-1)*150, 190, 40, 40, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
Next
$imagine = GUICtrlCreatePic("", 600, 40, 40, 40, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
Meteo("Cluj-Napoca")
GuiSetIcon("iconita2.ico")
GUISetState(@SW_SHOW)

Do
$msg = GUIGetMsg()
For $i=1 To 10
If $msg=$orase[$i] Then
$oras=GUICtrlRead(GUICtrlRead($listview))
$ceoras=StringSplit($oras,"|")
Meteo($ceoras[1])
EndIf
Next
Until $msg = $GUI_EVENT_CLOSE
GUIDelete()

Func Meteo($oras)
$url = "http://www.google.com/ig/api?weather=" & $oras & "&hl=ro";
$url=StringReplace($url,"ţ","t")
$url=StringReplace($url,"ş","s")
$url=StringReplace($url,"ă","a")
$url=StringReplace($url,"â","a")
$url=StringReplace($url,"î","i")
ConsoleWrite($url & @CRLF);
InetGet($url, @ScriptDir & "\vremea.xml", 1, 0)
$text = FileRead(@ScriptDir & "\vremea.xml")
GUICtrlSetData($oras_nume,$oras)
GUICtrlSetData($oras_stare,"Starea vremii: " & StringLower(IaValoare($text,'<current_conditions><condition data="’)) & ".")
GUICtrlSetData($oras_temperatura,"Temperatura: " & IaValoare($text,'<temp_c data="’) & " grade Celsius.")
GUICtrlSetData($oras_umiditate,"" & IaValoare($text,'<humidity data="’) & ".")
GUICtrlSetData($oras_vant,"" & IaValoare($text,'<wind_condition data="’) & ".")
ConsoleWrite("temperatura: " & IaValoare($text,'<icon data="’) & @CRLF);
InetGet("http://www.google.com/" & IaValoare($text,'<icon data="’), @ScriptDir & "\icon.gif")
GUICtrlSetImage($imagine, @ScriptDir & "\icon.gif")

For $i=1 To 4
$rez = IaValoare($text,'<forecast_conditions>’, ‘</forecast_conditions>’)
GUICtrlSetData($zile[$i],"" & IaValoare($text,'<day_of_week data="’))
GUICtrlSetData($temp[$i],"min. " & IaValoare($text,'<low data="’) & "° – max. " & IaValoare($text,'<high data="’) & "°")
GUICtrlSetData($prognoza[$i],"" & StringLower(IaValoare($text,'<condition data="’)))
InetGet("http://www.google.com/" & IaValoare($text,'<icon data="’), @ScriptDir & "\icon.gif")
GUICtrlSetImage($img[$i], @ScriptDir & "\icon.gif")
$text = StringTrimLeft($text,StringInStr($text,'</forecast_conditions>’))
Next
EndFunc

Func IaValoare($text, $cecaut1, $cecaut2=’"’)
$xml = StringSplit($text, $cecaut1, 1)
$xml2 = StringSplit($xml[2], $cecaut2, 1)
Return $xml2[1]
EndFunc[/PHP]

În linia 7 am definit nişte şiruri (array-uri). Din linia 9 începe crearea GUI-ului. Observaţi în linia 10 crearea listei, iar apoi „popularea” cu elemente (liniile 11-20). Apoi vine ceva interesant: „alocăm” pe GUI etichete (pentru text) şi imagini, dar fără să punem ceva acolo. Toate sunt goale. De ce? Pentru că ele vor primi valoare în funcţie de localitatea selectată de utilizator. Toate cifrele care sunt acolo vin de la amplarea pe GUI. În fine, ca să apară implicit ceva, punem datele primei localităţi.

Liniile 45-54 sunt cu bucla infinită deja celebră. Vedem dacă nu cumva s-a dat click pe vreun oraş, caz în care apelăm funcţia Meteo. Oraşul îl aflăm „spărgând” textul care vine cu GUICtrlRead pentru că argumentele vin de genul Lugoj|Timişoara. Iar acum să vedem funcţia Meteo. Folosim API-ul construind URL-ul pe care cu InetGet îl salvăm local în vremea.xml. Ei bine, acum ar trebui să parcurgem (parsing) XML-ul. AutoIt3 nu are nativ aşa ceva, dar există o bibliotecă neoficială. Dar ce sens avea când XML-ul e simplu şi poate fi parcurs şi ca text. Ştiu, codul nu e foarte uşor de înţeles, dar dacă studiaţi XML-ul veţi vedea ce şi cum e făcut. Cert e că în funcţia Meteo preiau pe rând informaţiile şi le afişez pe GUI.

PS: Toate fişierele acestei serii de tutoriale sunt publice şi descărcabile de aici. Exemplul de aici este fereastra09.au3 iar executabilul este temperaturi.exe.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (4 evaluări, media: 5,00 din 5)
Loading...Loading...

1 comentariu

  1. Online spune:

    Salut
    Pt. aceasta aplicatie cu se folosesc orasele formate din 2 cuvinte, ex.: Targu Jiu sau Targu Mures.
    Am incercat Targu Jiu, Targu+Jiu, Targu-Jiu; dar nu preia xml-ul de la google.
    Cum ar trebui scrise aceste orse in adresa URL?


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *