29.DOC

(107 KB) Pobierz









 

Rozdział 29.
Podstawy języków Tcl i Tk









E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\29.DOC              479










Rozdzia³ 29. ¨ Podstawy języków Tcl i Tk              491

Tim Parker

W tym rozdziale:

u                                          Czym jest Tcl?             

u                                          Czym jest Tk?             

u                                          Język Tcl             

u                                          Tk – nowe możliwości Tcl             

Czym jest Tcl?

Tcl (nazwa ta czyta się „tikl”, a pochodzi od angielskiej nazwy Tool Command Language) jest językiem przeznaczonym do pisania skryptów, podobnym nieco do języków interpreterów poleceń powłoki, omówionych w rozdziale 14. Używa się go głównie do szybkiego tworzenia programów działających w trybie tekstowym.

Język Tcl został zaprojektowany przez Johna Ousterhouta, późniejszego pracownika Uniwersytetu Kalifornijskiego w Berkeley. Jest on językiem interpretowanym, posiada więc typowe wady i zalety tego rodzaju języków. Największą wadą języków interpretowanych jest niewielka szybkość działania: program napisany w języku kompilowanym może działać wielokrotnie szybciej. Podstawową zaletą jest krótszy czas tworzenia aplikacji i możliwość natychmiastowego obejrzenia efektów wprowadzonych zmian, co wynika z braku etapu kompilacji programu.

Podstawowe możliwości funkcjonalne języka Tcl realizowane są za pomocą bazowego zestawu funkcji wewnętrznych, jednak jego prawdziwa potęga tkwi w nieograniczonych wręcz możliwościach rozbudowy. Programista może bez trudu tworzyć własne biblioteki, co więcej – może osadzać biblioteki Tcl we własnych programach. Dzięki temu możliwe jest wbudowanie do tworzonej aplikacji elementów języka skryptowego bez konieczności projektowania takiego języka od podstaw. W konsekwencji użytkownicy aplikacji uzyskują dostęp zarówno do wszystkich wewnętrznych poleceń Tcl, jak i do funkcji utworzonych przez programistę i umieszczonych w bibliotece języka.

Polecenia języka Tcl mogą być wywoływane po uruchomieniu jego interpretera. W większości systemów nazywa się on tclsh (w niektórych nosi nazwę tcl). Po uruchomieniu interpretera można już bezpośrednio wpisywać polecenia, na przykład:

 

puts stdout "Ahoj, przygodo!"

Polecenie to składa się z trzech elementów. Właściwe polecenie to puts; nazwa ta jest skrótem od angielskiego „put string”, zaś samo polecenie zapisuje dane do urządzenia określonego przez drugi element. W naszym przypadku urządzeniem tym jest standardowe urządzenie wyjściowe, czyli na ogół ekran monitora. Trzecim elementem polecenia jest wyprowadzany tekst. Cudzysłowy zapewniają, że zostanie on zinterpretowany jako pojedynczy wyraz.

 

stdout (standardowe urządzenie wyjścia) jest domyślnym urządzeniem wyjściowym dla polecenia puts, jeśli więc chcesz wydrukować coś na ekranie, drugi argument może zostać pominięty.

Nawet na tak nieskomplikowanym przykładzie widać, jaką postać ma składnia prostych poleceń języka Tcl (poleceń jest oczywiście znacznie więcej, jednak składnia pozostaje we wszystkich przypadkach identyczna):

 

polecenie parametr1 parametr2 ...

polecenie może być dowolną funkcją wewnętrzną języka Tcl bądź też wywołaniem zdefiniowanej przez programistę procedury rozszerzającej zestaw poleceń wbudowanych. W obu przypadkach obowiązująca składnia pozostaje taka sama.

Czym jest Tk?

Tk, również opracowany przez Johna Ousterhouta, jest rozszerzeniem języka Tcl o interfejs graficzny (oparty na systemie X Window). Pozwala on na tworzenie programów dla X Window w sposób znacznie łatwiejszy, niż przy użyciu konkurencyjnych bibliotek X, takich jak Motif czy Open Look. Pod wieloma względami przypomina on rodzinę języków Visual dla Windows (np. Visual Basic).

Podobnie jak Tcl, Tk również pozwala na wpisywanie poleceń, które następnie są interpretowane. Interpreter Tk jest nadzbiorem Tcl, toteż każdy program napisany w Tcl będzie działał w języku Tk. Tk obsługuje jednak wiele nowych funkcji, pozwalających łatwo i szybko dodać do programu interfejs X.

Interpreter poleceń Tk nazywa się wish (ang. windowing shell) i musi być uruchamiany w środowisku X (po uruchomieniu wyświetla on okno prezentujące wyniki wykonania interpretowanych poleceń trybu graficznego).

Po tym krótkim wprowadzeniu spróbujmy przepisać poprzedni program przykładowy tak, aby napis Ahoj, przygodo pojawił się na przycisku wyświetlanym w oknie interpretera wish. W tym celu należy najpierw uruchomić ten ostatni, czego dokonuje się poprzez wpisanie w oknie Xterm polecenia:

 

wish

Spowoduje to wyświetlenie okna wish i uruchomienie interpretera Tk w oknie Xterm. Polecenia języka Tcl (lub Tk) wpisuje się bezpośrednio w oknie Xterm. Aby wyświetlić w oknie wish nasz przycisk z napisem, musimy wprowadzić następujące polecenia:

 

button .b –text "Ahoj, przygodo!" –command exit
pack .b

Jak widać, składnia jest taka sama jak poprzednio: po właściwym poleceniu następuje pewna liczba argumentów. Pierwszy z nich to nazwa, którą zamierzamy przypisać przyciskowi. Postać następnych argumentów różni się od użytych w Tcl-owej wersji programu ­–składają się one z dwóch części: nazwy argumentu i jego wartości.

Drugi argument nazywa się text, a jego wartością jest tekst, który ma pojawić się na przycisku. Trzeci argument, o nazwie command, zawiera nazwę polecenia, które ma zostać wykonane po naciśnięciu przycisku. W naszym przypadku program nie powinien nic zrobić, toteż nakazujemy interpreterowi zakończenie przetwarzania skryptu.

Przycisk, który utworzyliśmy, nazywa się .b. Do jego wyświetlenia w oknie wish służy polecenie pack.

W naszym przykładzie polecenie to posiada tylko jeden argument: nazwę przycisku utworzonego w pierwszym wierszu programu. Wynikiem jego wykonania będzie więc wyświetlenie w oknie wish przycisku zawierającego napis Ahoj, przygodo.

W powyższym przykładzie warte omówienia są jeszcze dwie rzeczy. Po pierwsze, wyjaśnijmy, dlaczego nasz przycisk nosi nazwę .b, a nie np. b czy przycisk.. Sama nazwa jest tu mało istotna (można by oczywiście użyć nazwy przycisk), ważna jest natomiast rozpoczynająca ją kropka. Symbol kropki służy tu do reprezentowania hierarchii elementów sterujących (ang. widget). Każdy z nich zawarty jest w innym elemencie. Główny, nadrzędny element hierarchii zawarty jest bezpośrednio w oknie wish, a jego nazwą jest . (kropka; można tu zauważyć pewną analogię z linuxowym systemem plików, w którym poszczególne katalogi są wzajemnie zagnieżdżone, zaś katalog główny (najwyższego poziomu) nosi nazwę /). Za każdym razem, gdy tworzony jest nowy element, musimy poinformować interpreter Tk, w którym elemencie hierarchii będzie on zawarty. W naszym przypadku „pojemnikiem” na nowo tworzony przycisk jest element ., czyli główny element hierarchii.

Po drugie, zauważ, że po wykonaniu polecenia pack okno wish zmienia rozmiar, kurcząc się do rozmiarów utworzonego przycisku. Do zmiany tego zachowania i modyfikacji sposobu wyświetlania obiektów na ekranie służą liczne polecenia języka, którymi zajmiemy się nieco później.

Język Tcl

Po prezentacji przykładów wróćmy do podstaw i przyjrzyjmy się bliżej językowi Tcl. Zawiera on wiele poleceń, które pozwalają na tworzenie wszystkich konstrukcji spotykanych w innych językach programowania. Polecenia te zostaną omówione poniżej.

Zmienne i przypisywanie wartości

Podobnie jak interpretery poleceń powłoki UNIX-a, Tcl pozwala na korzystanie ze zmiennych, będących tymczasowymi pojemnikami na dane przetwarzane w programie. Nazwy zmiennych w języku Tcl składać się mogą z dowolnych znaków drukowalnych i na ogół związane są w jakiś sposób z przechowywaną w zmiennych informacją. Poprawnymi nazwami zmiennej przechowującej miesięczne zarobki pracownika są na przykład:

 

Miesieczne_zarobki
"Miesieczne zarobki"

 

Użycie cudzysłowu powoduje, że Tcl traktuje spacje i znaki tabulacji (czyli tzw. białe znaki) nie jako znaki rozdzielające wyrazy, tylko jako część nazwy. Dokładniejsze omówienie tego tematu znajdziesz w punkcie „Użycie cudzysłowów”.

Również wartość zmiennej może składać się z dowolnych znaków, na przykład:

 

"15,000"
15000
"patrz tabela 4"

Do przypisywania wartości do zmiennych służy w języku Tcl polecenie set. Może ono posiadać jeden lub dwa argumenty. W formie dwuargumentowej pierwszym argumentem jest nazwa zmiennej, zaś drugim – przypisywana do niej wartość. W przypadku użycia tylko jednego argumentu, jest on interpretowany jako nazwa zmiennej, której wartość zostanie zwrócona przez polecenie set. Poniższe polecenie powoduje przypisanie zmiennej Miesieczne_zarobki wartości 15000, a następnie wyświetlenie jej na ekranie:

 

set Miesieczne_zarobki 15000

Jeśli chcesz wyświetlić wartość zmiennej Miesieczne_zarobki, wpisz polecenie:

 

set Miesieczne_zarobki

Wszystkie zmienne (również numeryczne) przechowywane są jako łańcuchy znaków. Przykładowo, po przypisaniu:

 

set num 40

zmienna num będzie zawierała nie wartość liczbową, lecz ciąg znaków 40 (4 i 0).

Wiesz już, jak nadać zmiennej wartość i jak wyświetlić ją na ekranie. Aby wartości zmiennej użyć w poleceniu innym niż set, musisz jej nazwę poprzedzić znakiem $, nakazującym interpreterowi Tcl zwrócenie wartości następującej po nim zmiennej, np.:

 

set Miesieczne_zarobki 15000
expr $Miesieczne_zarobki*12

Pierwsze polecenie powoduje przypisanie zmiennej Miesieczne_zarobki wartości 15000. Polecenie expr służy do obliczania wartości wyrażeń – w naszym przypadku oblicza ono wartość zmiennej Miesieczne_zarobki pomnożoną przez 12.

Podstawienie polecenia

Podstawienie polecenia umożliwia użycie wyniku wykonania polecenia jako argumentu innego polecenia. Jest to możliwe dzięki otoczeniu nawiasami kwadratowymi polecenia, którego wartość ma zostać użyta w innym poleceniu, na przykład:

 

set Miesieczne_zarobki 15000
set Roczne_zarobki [ expr $Miesieczne_zarobki*12 ]

Pierwsze polecenie przypisuje zmiennej Miesieczne_zarobki wartość 15000. Drugie powoduje natomiast przypisanie zmiennej Roczne_zarobki wartości zwróconej przez polecenie expr zawarte w nawiasach kwadratowych (czyli wartości zmiennej Miesieczne_ zarobki pomnożonej przez 12).

W powyższym przykładzie w nawiasie kwadratowym występuje tylko jedno polecenie. Tcl pozwala jednak na umieszczenie tam dowolnego prawidłowego skryptu, czyli dowolnej liczby prawidłowych poleceń.

Użycie cudzysłowów

Zdarza się, że w programach trzeba użyć znaków mających specjalne znaczenie dla języka Tcl, ale nie chcesz, aby były one interpretowane. Możesz je ukryć przed interpreterem na trzy sposoby.

Pierwszy z nich to użycie podwójnego cudzysłowu (""). Zapobiega on interpretacji znaków białych. Kiedy chcesz, aby Tcl potraktował kilka wyrazów jako całość, powinieneś otoczyć je podwójnym cudzysłowem. Przykładem może być nazwa zmiennej składająca się z dwóch wyrazów: Miesieczne zarobki. Aby przypisać zmiennej o takiej nazwie wartość 1500, powinieneś wydać polecenie:

 

set "Miesieczne zarobki" 1500

Podwójne cudzysłowy przydają się również w przypadku, gdy chcesz przypisać zmiennej wartość składającą się z więcej niż jednego wyrazu, np.:

 

set Nagl1 "Zarobki w firmie"

Drugim sposobem ukrywania znaków przed interpreterem języka Tcl jest użycie symbolu lewego ukośnika (\). Powoduje on ukrycie jednego, następującego bezpośrednio po nim znaku. Najczęściej używa się go przed znakami takimi jak $, na przykład w taki sposób:

 

set Nagl1 "Miesięczne zarobki wynosiły średnio \$1200"

W powyższym przykładzie zmiennej Nagl1 zostanie przypisana wartość Miesięczne zarobki wynosiły średnio $1200. Dzięki zastosowaniu znaku \ interpreter języka Tcl nie próbuje wykonywać podstawienia zmiennej o nazwie $1200, co spowodowałoby błąd (ponieważ taka zmienna nie została zdefiniowana). Znak $ traktowany jest w tym przypadku tak jak każdy inny znak.

Trzeci sposób, najbardziej „skuteczny”, to użycie nawiasów klamrowych ({}). Zapobiegają one interpretacji wszystkich znaków specjalnych, w tym również znaków białych. Poniższe polecenie ma taki sam skutek jak polecenie podane w poprzednim przykładzie:

 

set Nagl1 {Miesięczne zarobki wynosiły średnio $1200}

Bardzo ważny jest fakt, że znaki specjalne występujące w argumentach poleceń nie są interpretowane od razu przez Tcl, ale dopiero po przesłaniu ich do odpowiedniego polecenia. Oto przykład takiej opóźnionej interpretacji:

 

set liczn 0
while {$liczn < 3} {
              puts "Wartosc zmiennej liczn wynosi $liczn"
              set liczn [ expr $liczn + 1]
}

W powyższym przykładzie instrukcja while musi przetworzyć oba argumenty w każdym przebiegu pętli. Z tego powodu konieczne jest, by interpreter zignorował wszystkie symbole specjalne występujące w tych argumentach, pozostawiając ich interpretację poleceniu while.

Zapoznaliśmy się już z podstawami języka Tcl, pora więc przyjrzeć się kilku nieco bardziej zaawansowanym poleceniom.

Instrukcja if

Instrukcja if działa tak, jak w innych językach programowania: powoduje wykonanie fragmentu kodu pod warunkiem, że jakieś wyrażenie jest prawdziwe. Jej składnia jest następująca:

 

if {wyrazenie} {polecenie}

Polecenie if wymaga podania dwóch argumentów. Pierwszy z nich to warunek, w zależności od którego wykonywane są polecenia podane jako drugi argument. Warunek jest zwykle wyrażeniem logicznym, przyjmującym wartości prawda lub fałsz, np.:

 

$i < 10
$num = 2

Tcl traktuje wszystkie wyrażenia o wartości zero jako fałszywe, zaś pozostałe – jako prawdziwe. Podobną sytuację mamy w takich językach programowania, jak C czy Perl, ale dokładnie odwrotnie jest na przykład w przypadku programu użytkowego test. Musisz niestety przyzwyczaić się do tej niedogodności.

Wyrażenia takie jak:

...

Zgłoś jeśli naruszono regulamin