To jest stara wersja strony!
Prolog, graficzny interfejs użytkownika XPCE
XPCE jest zorientowanym obiektowo podsystemem wizualizacji dla środowiska SWI-Prolog.
Wprowadzenie
Tworzenie obiektów
new/2 (new(?Reference, +NewTerm)) umożliwia tworzenie obiektów graficznych, pierwszy argument zwraca referencje do utworzonego obieku (unikalny identyfikator) z użyciem @/1, drugi argument jest rodzajem obiektu (klasą) do utworzenia.
?- new(P, point(10,20)).
P = @772024
?- new(@demo, dialog('Demo Window')).
free/1 (free(+Reference)) niszczy obiekty, argumentem jest identyfikator obiektu (pierwszy argument new/2).
Modyfikacja stanu obiektów
Stan obiektu można zmodyfikować korzystając z predykatu: send/2.
Pierwszym argumentem jest referencja obiektu, drugim metoda do wykonania.
Poniższy przykład dodaje pole tekstowe do utworzonego wcześniej okna dialogowego.
?- send(@demo, append(text_item(nazwa))).
Aby wyświetlic tak utworzony obiekt należy użyc metody open
:
?- send(@demo, open).
send można również dekomponując term, zatem powyższy przykład można zapisać jako:
?- send(@demo, append, text_item(nazwa)).
zatem kolejne argumenty send licząc od 3-go będą argumentami metody append.
XPCE definiuje kilka standardowych obiektów m.in. @display oraz @prolog.
@display reprezentuje ekran.
@prolog jest obiektem reprezentującym maszynę wnioskującą.
Dowolny predykat zdefiniowany w Prologu jest metodą, w nomenkleaturze XPCE.
Zatem za pomocą send można uruchomic np. write/1:
?- send(@prolog, write('hello')).
Odpytywanie obiektów
get/3 (get(+Receiver, +Selector(+Argument…), -Result)) umożliwia uzyskanie informacji o stanie obiektu.
Np. aby dowiedzieć się jaka jest szerokość obiektu:
?- get(@demo,width,X)
albo o wartości wpisanej do pola tekstowego (metoda member
wyszuka wlaściwy obiekt, po nazwie, jaka była uzyta do jego utworzenia w tym przypadku nazwa
):
?- get(@demo, member(nazwa), ObiektTekstowy), get(ObiektTekstowy, selection, ToCoUzytkownikWpisal).
Biorąc pod uwagę poniższy program:
:- new(@demo, dialog('Okno Testowe')),
new(@txt,text_item('to Jest tekst:')),
send(@demo,append(@txt)),
send(@demo,open).
Zapytanie:
?- get(@txt,selection,X).
uzgodni z szukaną X
wartość wprowadzoną przez użytkownika.
?- get(@display,width,X).
Akcje
Aby zaprogramować zdarzenie związane z akcją użytkownika nalezy skorzystać z uśpionego send.
Poniższy kod utworzy okno o nazwie 'dialogowe' oraz przycisk 'nacisnij'.
Po nacisnięciu przycisku na standardowym wyjściu pojawi się napiś 'au! nie naciskaj'.
?- new(@okno,dialog(dialogowe)),
new(@but,button(nacisnij,message(@prolog,write,'au! nie naciskaj!\n'))),
send(@okno,append,@but),
send(@okno,open).
albo w krótszej wersji:
?- new(@okno,dialog(dialogowe)),
send(@okno,append(button(nacisnij,message(@prolog,write,'au! nie naciskaj!\n')))),
send(@okno,open).
Selektor
wypisz(X):-
new(Okno,dialog(wpisales)),
send(Okno,append(text(X))),
send(Okno,open).
ui:-
new(Okno,dialog(dialogowe)),
send(Okno,append(new(Txt,text_item(pole_tekstowe)))),
send(Okno,append(button(nacisnij,message(@prolog,wypisz,Txt?selection)))),
send(Okno,open).
:- ui.
W 9 lini występuje tzw. selektor. Pozwala on na wybranie określonej własności obiektu, która ma być przekazana.
W tym przypadku jest to wartość selection
pola tekstowego (szukana Txt
), czyli tekst wpisany w pole przez użytkownika.