Interfaces en swi-prolog usando XPCE:La creacion de interfaces en swi-prolog no es tan complicada como podriamos imaginarnos por ejemplo tenemos lo siguiente :
primerVentana:-new(D, dialog('Nombre de tu ventana')), send(D, open).
Existen cuatro predicados basicos que te permiten interactuar con los objetos de swi-prolog :?? new(?Reference, +NewTerm): Este predicado recoge dos parámetros, el primero recogería la referencia que se le asigna al nuevo objeto, ya que new se usa para crear objetos. El segundo parámetro le indicaría el objeto que se quiere crear.
?? send(?Receiver, +Selector(...Args...)): El primer parámetro del predicado es una referencia al objeto que deseemos enviarle un mensaje. El segundo parámetro indicará el método al que queremos invocar, lo cual indicaremos junto a los argumentos que queremos enviarle al método.
?? get(?Receiver, +Selector(+Argument...), -Result): Los dos primeros parámetros tienen el mismo significado que para send, sin embargo el último parámetro sirve para recoger el valor que nos devuelva el método que hallamos invocado.
?? free(?Reference): libera la memoria asociada al objeto que se le indica en el primer parámetro.
Los objetos que podemos manejara en swi-prolog son:
button
label
menu
menu_bar
menu_item
popup
slider
window
int_item
editor
text
text_item
picture
etc.
Cada uno de estos objetos como vimos en el ejemplo primeraVentana se alamcenan en variable por intuicion podemos concluir que para agreagar un boton a una ventana primero crearemos ambos objetos y despues agregaremos la variable de un boton a la variable de la ventana.
Todos estos objetos tienen atributos como:size
display
margin
colour
style
background
font
etc.
Explicare algunos Objetos con mayor detalle:DIALOG
Esta es la clase básica para crear dialogos.
Constructor:
dialog(label=[name], size=[size], display=[display])
name: indica el titulo a la ventana
size: es de tipo size y sirve para indicar el tamaño de la ventana display: indica donde queremos que se visualize (mejor no tocar este parametro si no sabemos que estamos haciendo) Podemos observar que todos los parametros son opcionales, aunque siempre es bueno ponerle un titulo a la ventana Así, como ejemplo crearemos un dialogo con titulo ‘Titulo del dialogo’ y de tamaño 440 x 320.
new(D, dialog(‘Titulo del Dialogo’, size(440, 320)) ),
Métodos:
Esta clase dispone de varios métodos que pueden resultar interesantes, entre ellos tenemos:
append(Objeto): Insertaria el objeto Objeto dentro del dialogo, visualizandolo en
el mismo, por ejemplo sirve para insertar un boton o cualquier otra cosa, como en el siguiente ejemplo:
send(D, append(button(‘Boton 1’)))
open(): abre la ventana de diálogo visualizandola en pantalla:
send(D, open),
destroy(): cierra la ventana de diá logo visualizada en pantalla:
send(D, destroy),
BUTTON
Esta es la clase básica para crear botones
Constructor:
button(name=name, message=[code]*, label=[name] )
name: indica el nombre del boton (si no se especifica la etiqueta que queramos que tenga el boton, entonces adoptará una etiqueta con el mismo texto que name)
message: indica el mensaje o acción que queremos que sea ejecutado cuando pulsemos sobre el botón con el ratón.
label: Indica la etiqueta que queremos que se muestre en el boton.
new(Boton, button(‘Salir’, message(Dialogo, quit)))
LABELEsta es la clase básica para crear etiquetas de texto
Constructor:label(name=[name], selection=[stringimage], font=[font])
name: indica el nombre de la etiqueta
selection: puede ser una cadena o una imagen que queremos que sea mostrada en el lugar donde aparece la etiqueta.
font: permite indicar la fuente en la que queremos mostrar el texto
new(L, label(nombre, ‘texto que queramos que sea mostrado’)),
WINDOWEsta clase sirve para crear ventanas donde dibujar o poner otros objetos graficos
Constructor:
window(label=[name], size=[size], display=[display])
name: indica el nombre de la ventana
size: indica el tamaño que queremos tenga la ventana
display: indica donde queremos que aparezca (recomendamos no usar este parametro)
Por ejemplo para crear una nueva ventana (de gráficos) de tamaño 320x200 pixels new(W, window(‘nombre ventana’, size(320, 200)),
Métodos:Para esta clase nos interesarán básicamente los métodos ‘display’ y ‘flush’: display(figure, point): sirve para mostrar una figura en un lugar determinado de la ventana una determinada figura (que por ejemplo puede ser una imagen) y point que indicará las coordenadas (x,y) de la ventana donde queremos que se muestre.
El siguiente ejemplo mostraría la figura Figure en la posicion (22, 32) de la ventana W.
send(W, display, Figure, point(22,32))
flush(): sirve para redibujar la venana que invoca al método, es decir, si estamos realizando una serie de llamadas y no está en el bucle principal de la ventana, entonces podemos llamar a este método para redibujar la ventana y los elementos que hayamos creado o movido.
send(W, flush)
Otros predicados y funciones importantes serian:timer: new( timer(0.2,'Aqui lo que se ejecutaro cad cierto tiempo')
declarar variables globales: :- pce_global(@'aquinombre varglobal', new('objeto que sera global')).
ubicacion de objetos dentro de otro objetos: right ,below ,next_row
para cambiar forma de cursor: new(cursor('nombre del nuevo cursor')
para retornar y esperar confirmacion de un objeto: return confirm
para ejecutar predicados con parametros : message,?selection ejemplo-> message(@prolog, nombrepredicado, TI?selection)
retrazar una ejecucion: sleep(10)
etc.
Manejo de eventos:Para manejar los eventos de mouse como los de teclado aqui les dejo su estructura .
Para mouse:
click_gesture
Para teclado:
key_binding
Algunos eventos:
handler
handler_group
key_binding
click_gesture
connect_gesture
move_gesture
move_outline_gesture
resize_gesture
resize_outline_gesture
Manejo de imagenes :
swi-prolog te permite manejar diferentes formatos de imagenes como por ejemplo JPEG, GIF, BMP y PNM.
Para utilizar las imagenes primero tenemos que indicar el directorio en donde se encuentran
:-pce_image_directory(‘direccion de la carpeta de imagenes ’)
despues procedemos a seleccionar el nombre de la imagen:
resource(fondo, image, image(‘nonbre de la imagen’)).
Para poder mostrar la imagen fondo en un dialogo primero debemos primero debemos pasar la imagen a Bitmap para luego si mostrarla en el dialogo o ventana.
Para mover imagenes tenemos los siguientes atributos:
send(Figure, move, point(X, Y)).
send(Figure, relative_move, point(X, Y)).
Las imagenes se comportan igual que cualquier objeto visto anteriormente y se les puede agregar eventos de mouse como de teclado.
Funciones para un entorno grafico:
La
principales funciones para dibujar con swiprolog serian:
arrow
bezier
bitmap
box
circle
ellipse
arc
line
path
text
etc.
Creacion de ejecutables swi-prolog:
A continucaion un codigo para crear ejecutables :
save(Exe):- pce_autoload_all, qsave_program(Exe,[ emulator(swi('bin/xpce-stub.exe')), stand_alone(true), goal(main) ]).
Descargar ejecutables que desarrolle para el curso de programacion logica en swi-prolog:
Tan solo debo hacerles recordar que los ejecutables de swi-prolog no son tan buenos como quisieramos pues su ejecucion se hase un poco pesada.
Para ejecutar algun ejecutable primero descargar la carpeta Bin dentro de ella deberan de poner los ejecutables y posteriormente daran doble click sobre cada uno respectivamente.
Descargar Carpeta BinDescargar Tres raya swi-prologDescargar Snake swi-prologDescargar Sistema Experto swi-prologDescargar Damas swi-prologDescargar Automata-redPetri swi-prologDescargar Tetris swi-prolog