[[
✎ pl:prolog:prolog_lab:prolog_lab_xpce
]]
aiWiki
Pokaż stronę
Ostatnie zmiany
Indeks
Zaloguj
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
====== Prolog, graficzny interfejs użytkownika XPCE ====== XPCE jest zorientowanym obiektowo podsystemem wizualizacji dla środowiska SWI-Prolog. Pełna dokumentacja XPCE znajduje się pod adresem: http://hcs.science.uva.nl/projects/xpce/UserGuide/ ===== 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. <code prolog> ?- new(P, point(10,20)). P = @772024 ?- new(@demo, dialog('Demo Window')). </code> free/1 (free(+Reference)) niszczy obiekty, argumentem jest identyfikator obiektu (pierwszy argument new/2). <code prolog> ?- free(@demo). </code> **Uwaga:** Wszystkie obiekty utworzone z wykorzysaniem //named reference// (@demo w powyższym przykładzie) muszą być usunięte za pomocą free/2 w celu uniknięcia wycieków pamięci. Jeżeli referenca obiektu nie jest nazwana (pierwszy argument new jest szukaną), obiekty takie są automatycznie niszczone. ==== 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: <code prolog> :- new(@demo, dialog('Okno Testowe')), new(@txt,text_item('to Jest tekst:')), send(@demo,append(@txt)), send(@demo,open). </code> Zapytanie: ?- get(@txt,selection,X). uzgodni z szukaną ''X'' wartość wprowadzoną przez użytkownika. Poniższe zapytanie uzgodni szerokość ekranu z szukaną X: ?- 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'. <code prolog> ?- new(@okno,dialog(dialogowe)), new(@but,button(nacisnij,message(@prolog,write,'au! nie naciskaj!\n'))), send(@okno,append,@but), send(@okno,open). </code> albo w krótszej wersji: <code prolog> ?- new(@okno,dialog(dialogowe)), send(@okno,append(button(nacisnij,message(@prolog,write,'au! nie naciskaj!\n')))), send(@okno,open). </code> === Selektor === <code prolog> 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. </code> 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. **Uwaga:** Wszystkie referencje do obiektów (rezultaty predykatu new/2) w powyższym przykładzie tworzone są automatycznie (nie są to //named references//), nie trzeba stosować free/2, niszczeniem obiektów zajmie się garbage collector. ==== Okna modalne ==== TBD ==== Obiekty graficzne ==== TBD ==== Obiekty połączone ==== TBD ==== Mysz: interakcja z obiektami graficznymi ==== TBD <code prolog> :- pce_global(@in_out_link, make_in_out_link). make_in_out_link(L) :- new(L, link(in, out, line(arrows := second))). linked_box_demo :- new(P, picture('Linked Box demo')), send(P, open), send(P, display, new(B1, box(50,50)), point(20,20)), send(P, display, new(B2, box(25,25)), point(100,100)), send(B1, handle, handle(w, h/2, in)), send(B2, handle, handle(w/2, 0, out)), send_list([B1, B2], recogniser, new(move_gesture(left))), send(B1, connect, B2, @in_out_link). </code> ===== ĆWICZENIA ===== ==== Ćwiczenie 1: Okno dialogowe ==== Przetestuj poniższy program ((przykład zaczerpnięty z http://hcs.science.uva.nl/projects/xpce/UserGuide/sec-4.1.html)). ''send_list'' działa podobnie jak ''send'' przu czym uruchamia wskazaną metodę z argumentami będącymi kolejnymi elementami listy. Pojedynczy predykat ''send_list'' zastępuje wiele predykatów ''send''. <code prolog> :-dynamic(employee/2). ask_employee :- new(Dialog, dialog('Define employee')), send_list(Dialog, append, [ new(N1, text_item(first_name)), new(N2, text_item(family_name)), new(S, new(S, menu(sex))), new(A, int_item(age, low := 18, high := 65)), new(D, menu(department, cycle)), button(cancel, message(Dialog, destroy)), button(enter, and(message(@prolog, assert_employee, N1?selection, N2?selection, S?selection, A?selection, D?selection), message(Dialog, destroy))) ]), send_list(S, append, [male, female]), send_list(D, append, [research, development, marketing]), send(Dialog, default_button, enter), send(Dialog, open). assert_employee(FirstName, FamilyName, Sex, Age, Dept) :- assert(employee(FirstName, FamilyName, Sex, Age, Dept)). </code> ==== Ćwiczenie 2: Okno dialogowe ==== Dopisz redykat ''show_employees/0'' umożliwiający przeglądanie danych pochodzących z ''employee/5''. ==== Ćwiczenie 3: Okna modalne ==== TBD ==== Ćwiczenie 4: Obiekty graficzne ==== TBD
pl/prolog/prolog_lab/prolog_lab_xpce.1208683305.txt.gz
· ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
Pokaż stronę
Poprzednie wersje
Menadżer multimediów
Do góry