Búscalo aquí:

Interfaz en SWI Prolog usando XPCE

En esta ocasión vamos a ver como podemos colocar una interfaz sencilla en SWI Prolog usando la interfaz XPCE.

Para esto vamos a suponer el caso en el que queremos una interfaz que muestre un texto y dos botones: uno de Aceptar y otro de Cancelar, luego capturaremos la respuesta de acuerdo al boton que el usuario clickeará.

Observemos el siguiente código:
  1. GUI_Prgta(Preg,Resp) :-
  2. new(D, dialog('Pregunta')),
  3. send(D, append,
  4. label(pr,Preg,font('times','roman',16))),
  5. send(D, append,
  6. button(btn_si,message(D,return,'si'))),
  7. send(D, append,
  8. button(btn_no,message(D,return,'no'))),
  9. send(D, default_button, btn_si),
  10. get(D, confirm, Rval),
  11. free(D),
  12. Resp = Rval.

En la linea 1 se encuentra la función a la que llamaremos GUI_Prgta, la cual tiene como parámetros Preg (la cual es una cadena de caracteres y representa una pregunta para el usuario final) y Rpta (la cual será capturada por el programa desde la interfaz). En la línea 2 creamos un objeto de tipo dialogo al cual referenciaremos con la variable D y tendrá por título en su barra de título: Pregunta.

En las lineas 3 y 4 agregamos al dialogo D un objeto label llamado pr la cadena de caracteres contenida en la variable Preg y le ponemos como propiedades determinados estilos de letras y el tamaño de las mismas. Con la llamada a send hacemos que estos cambios sobre el dialogo sean visibles.

En las lineas 5 y 6 agregamos al dialogo D un objeto boton llamado btn_si, el cual, ante el evento de clic capturará la cadena 'si' como respuesta. En las lineas 7 y 8 de manera similar agregamos al dialogo D un objeto boton llamado btn_no, el cual, ante el evento de clic capturará la cadena 'no' como respuesta.

En la linea 9 colocamos al boton btn_si como boton activo por defecto. En la linea 10 confirmamos los eventos realizados en los botones sobre el dialogo D y almacenamos el valor capturado en la variable Rval. En la linea 11 liberamos memoria. Finalmente, en la linea 12 guadamos el valor de la variable Rval en la variable Rpta.
Lo único que se necesita ahora es una funcion principal que se encargue de llamar a GUI_Prgta enviandole una cadena de caracteres como parámetro (Preg) y que recibirála respuesta a dicha pregunta en la variable Resp.

Espero les sirva, saludos :D





Quieres leer más post como éste???...suscribete aquí!!!

22 comentarios:

  1. Hola que tal, visité tu pagina web y es muy buena, te felicito.
    Te cuento que estoy desarrollando un sistema experto con swi-prolog y recien estoy aprendiendo XPCE, la consulta es:
    Existen tutoriales en castellano?
    Necesito crear unas ventanas simples con popup y tengo muchas dudas.
    Saqué un ejemplo del manual Programming in XPCE-Prolog User Guide pero nose como ejecutarlo, lo compilo y bien, pero como lo ejecuto?

    Te paso el codigo fuente. Siempre se ejecutan en la linea de comandos con el predicado principal, como seria?

    % Pull in the classes
    :- pce_autoload(report_dialog, library(pce_report)).
    :- pce_autoload(tool_bar, library(toolbar)).
    :- pce_autoload(finder, library(find_file)).
    :- pce_global(@finder, new(finder)).
    % Define icons as program resources
    resource(printer, image, image('16x16/print.xpm')).
    resource(floppy, image, image('16x16/save.xpm')).
    % Define the application as a subclass of frame.

    :- pce_begin_class(myapp, frame,
    "Frame representing the application").

    initialise(MyApp) :->
    send_super(MyApp, initialise, 'My application'),
    send(MyApp, append, new(D, dialog)),
    send(D, pen, 0),
    send(D, gap, size(5, 5)),
    send(D, append, new(menu_bar)),
    send(D, append, new(tool_bar(MyApp))),
    send(MyApp, fill_menu_bar),
    send(MyApp, fill_tool_bar),
    send(new(W, myapp_workspace), below, D),
    send(new(report_dialog), below, W).
    fill_menu_bar(F) :->
    get(F, member, dialog, D),
    get(D, member, menu_bar, MB),
    send_list(MB, append,
    [ new(File, popup(file)),
    new(_Edit, popup(edit))
    ]),
    send_list(File, append,
    [ menu_item(load,
    message(F, load),
    end_group := @on),
    menu_item(print,
    message(F, print))
    ]).
    fill_tool_bar(F) :->
    get(F, member, dialog, D),
    get(D, member, tool_bar, TB),
    send_list(TB, append,
    [ tool_button(load,
    resource(floppy),
    load),
    gap, % skip a little
    tool_button(print,
    resource(printer),
    print)
    ]).

    print(MyApp) :->
    "Print the document"::
    send(MyApp, report, progress, 'Printing ...'),
    get(MyApp, member, myapp_workspace, WS),
    send(WS, print),
    send(MyApp, report, progress, done).

    load(MyApp) :->
    "Ask a file and load it"::
    get(@finder, file, @on, myp, File),
    get(MyApp, member, myapp_workspace, WS),
    send(WS, load, File).
    :- pce_end_class(myapp).
    % dummy class for the work-area of your application
    :- pce_begin_class(myapp_workspace, window).
    :- pce_end_class(myapp_workspace).




    Desde ya te agradezco.
    Saludos.

    ResponderEliminar
  2. Saludos, gracias por visitar mi blog :D

    Haber ahora estoy full time, pero le di una revisada rapida al codigo y hasta donde veo la funcion principal es: initialise(MyApp), donde MyApp es el nombre de tu aplicacion (una cadena de caracteres por ejm 'Mi aplicacion'),

    Entonces desde el shell llama a initialise('Mi aplicacion'), espero se trate de eso, saludos.

    ResponderEliminar
  3. hola me gustaria saber si existen tutoriales en español que nos puedas facilitar te lo agradeceria mucho si me puedes enviar algo de informacion a soyer112004@yahoo.es

    muchas gracias jorge creo que aportas mucho a la programacion logica con tu block

    ResponderEliminar
  4. Saludos gracias por leer mi blog y comentar :D

    La documentación de SWI Prolog existente se encuentra en la web oficial de swi prolog en: http://www.swi-prolog.org/pldoc/index.html en ingles, desconozco totalmente de la existencia de documentación traducida al español :-(.

    ResponderEliminar
  5. muchas gracias por contestarme jorge quisiera saber si no tenes algun ejemplo de programas con la parte grafica como cajas de texto y enlaces o algun ejemplo de un sistema experto para poder guiarme
    att juan centeno soyer112004@yahoo.es

    ResponderEliminar
  6. muchas gracias por contestarme jorge quisiera saber si no tenes algun ejemplo de programas con la parte grafica como cajas de texto y enlaces o algun ejemplo de un sistema experto para poder guiarme
    att juan centeno soyer112004@yahoo.es

    ResponderEliminar
  7. hola como esta te queria preguntar con que version de java puego conectar swiprolog por que tengo netbeans 6.5 pero no se si se puede conectar y como es que se hace si me puedes dar una ayuda te lo agradesco soyer112004@yahoo.es

    ResponderEliminar
  8. Personalmente tuve un proyecto en el que conecté SWI Prolog con Java usando el IDE NetBeans, en esa ocasión usé NetBeans 5.5, en esa ocasión programé un sistema experto, en donde SWI prolog realizaba todo el procesamiento y usaba Java solamente para la parte de interfaces. Aquí puedes ver los resultados: AQUISupongo que de la misma manera, se puede trabajar en la nueva versión de NetBeans. En este link: http://www.seccperu.org/files/ConexJava-Prolog.pdf se publica un manual sencillo de como realizar la conexión de Prolog con Java, especificamente en el IDE NetBeans, espero te sirva, saludos.

    ResponderEliminar
  9. muchas gracias jorge saludos soyer112004@yahoo.es

    ResponderEliminar
  10. la verdad no se mucho de prolog quisiera que me ayuden como alinear mis imagenes y text_item en una determinada posicion

    ResponderEliminar
  11. Jorge:
    hola. me parece interesante lo que publicas en tu blog sobre Prolog. Veo que conseguiste hacer uso de la biblioteca XPCE. Me gustaría que me pudieras ayudar con la biblioteca HTTP de SWI-Prolog. Según el manual de usuario uno debería usar el predicado "module/2" pero cuando consulté el shell:
    :-help(module/2).
    sólo figura "module/1". En el código que aquí expones sobre XPCE no se expone como cargaste la biblioteca al shell o como la cargaste desde tu código en prolog. Espero me puedas socorrer.
    gracias de antemano
    jorge fuentes

    ResponderEliminar
  12. Jorge:
    hola. me parece interesante lo que publicas sobre Prolog, en particular veo que has logrado usar la biblioteca XPCE. ¿Cómo lo lograste? En el manual de usuario de SWI-Prolog dice que se debe usar el predicado "module/2" pero cuando consulto en el shell:
    :-help(module/2).
    No existe tal predicado sino "module/1". Espero que me puedas ayudar ya que no sé cómo pudiste cargar la biblioteca XPCE ya sea desde el shell o desde tu código
    espero me ayudes y agradecido
    jorge fuentes

    ResponderEliminar
  13. Como puedo capturar el valor ingresado en una caja de texto en prolog.

    ResponderEliminar
  14. Hola puedes usar: text_item(etiqueta) para agregar una caja de texto, ademas un boton de confiurmacion (como se muestra en el post). Suponiendo que a la caja de texto le asignemos la variable Nombre y al boton de confirmacion la variable ok, entonces deberas hacer esto:

    button(ok, message(nombreVentanaPadre, return,Nombre?selection))

    saludos

    ResponderEliminar
  15. Hola gracias por tu respuesta anterior fue de gran utilidad, y disculpa por preguntar de nuevo, como podria acumular un valor numerico en una variable.

    calcular(0,1).
    calcular(N,F):-
    F is F + N.

    despues llamo a calcular asi:

    calcular(10,V),

    pero me vota el siguente error

    ERROR: Arguments are not sufficiently instantiated
    ^ Exception: (12) _G387 is _G387+10 ?

    Gracias de antemano.

    ResponderEliminar
  16. Hola disculpa la demora en responder, si te das cuenta al llamar a calcular(10,V) estas colocando como parámetro a V el cual no tiene un valor, es decir, que no ha sido instanciado previamente, por eso te aparece el error que mencionas.

    saludos

    ResponderEliminar
  17. hola buenos días, me gusta tu pag.quiera saber si me puedes ayudar, tengo una pequeña duda, como puedo agregar una imagen en XPCE diseño las interfaz usando XPCE pero se ven muy simples,quisiera agregar imagenes pero no encuentro como, me gustaría saber si tienes algún tutorial de como agregar imágenes usando XPCE.
    Gracias por tu atención

    ResponderEliminar
  18. Hola, no puedo hacer ke el codigo ke poner aca, funcione con mi funcion principal.... la cual es:

    main(X):-
    new(D,dialog('SISTEMA EXPERTO')),
    send(D,size,size(400,400)),
    send(D, append, new(Menu, menu_bar)),
    send(Menu, append, new(Iniciar, popup(iniciar))),
    send_list(Iniciar, append,
    [ menu_item(iniciar_sistema, message(@prolog,hola('Ud se llama Carlos?', X)))
    ]),
    send(D,open).

    ResponderEliminar
  19. En el código que muestras, cuando llamo a la función principal solo me acepta de esta forma gUI_Prgta(Preg,Resp):- ... (también debo de cambiarlo en la definición de la función)
    Y Gracias por mostrar el ejemplo de interfaz en XPCE.
    Saludos.

    ResponderEliminar
  20. es posible q por medio de un dialogo por ejemplo
    nombre: fulanito

    boton aceptar

    al dar clic en el boton aceptar el nombre se pase a otra ventana

    ResponderEliminar
  21. Hola, me estoy iniciando en Prolog y he leido tu página. En mi empresa trabajamos con Delphi XE y necesitamos mostrarle al cliente, desde una aplicacion hecha en Delphi, propuesta de cambios de turnos de los trabajadores, cambios operativos. De todod estos cambios, debemos proponer los que tienen menos costes economicos, costes de trabajador/tiempo de descanso, etc. Bueno, no me dilato mas; la idea que tengo es poder llamar a Prolog para el proceso fuerte y seguir usando Delphi como interface.¿Se puede llamar a Prolog desde Delphi?.

    Ante todo gracias.

    ResponderEliminar
  22. Oye y para poner un botón para regresar a la pregunta anterior?

    ResponderEliminar

Bienvenido a jcGeorge's Blog!!!

Por favor deja tu comentario, consulta o sugerencia, procura mantener habilitado tu perfil de Blogger o deja un enlace a tu blog o web.

Gracias por leer este blog!!!

Related Posts Plugin for WordPress, Blogger...