2012-02-15 41 views
11

He desarrollado GUI antes en Matlab utilizando la caja de herramientas de GUI, y ahora estoy usando lisp común para mi proyecto. Necesito desarrollar una GUI que probablemente tenga un botón, un botón de opción, una ventana de figura, etc.Desarrollo de interfaz gráfica de usuario de Common Lisp

Solo quiero saber si es factible hacer esto en Common Lisp y si hay cajas de herramientas, bibliotecas que son bastante fácil de usar y aprender No tengo una gran experiencia en programación, así que trataré de evitar cosas avanzadas, si es posible.
Muchas gracias de antemano.

+0

Una búsqueda web para 'kit de herramientas de interfaz gráfica de usuario Common Lisp 'parece aparecer varios, así que creo que la viabilidad está asegurada. – phils

Respuesta

7

Eche un vistazo a LTK, que es un contenedor para la interfaz con el kit de herramientas Tk GUI. Es muy fácil comenzar con esto y debería ser suficiente para una aplicación simple.

+0

¿puedo usar Ltk como una herramienta de trazado también? o ¿será mejor para mí usar gnuplot o alguna otra herramienta de trazado? – YBE

+0

Nunca lo he usado así, pero cgn (http://www.cliki.net/cgn) parece hacer el truco: simplemente lo instalé con quicklisp y ejecuto con éxito el código de prueba. –

4

Si se encuentra en un entorno Unix-ish, es posible que desee probar cl-gtk2 o commonqt o incluso CLIM. Además, su elección de un juego de herramientas de interfaz de usuario depende de la implementación de Common Lisp que esté utilizando. Lisp Works y Allegro CL ambos vienen con sus propios juegos de herramientas de interfaz de usuario, que funcionan (más o menos) plataforma independiente.

9

En segundo lugar sugiero usar LTK.

Sin embargo, si sus requisitos crecen más allá de lo que ofrece LTK (y puede permitirse pasar algún tiempo aprendiendo JavaScript + HTML + CSS básico - eso probablemente significa no evitar las "cosas avanzadas" que menciona en la pregunta), puede encontrar es útil hacer una interfaz web para su aplicación.

Debido a que no pude encontrar una alternativa decente libre para escribir portátiles interfaces gráficas de usuario en la CL, decidí escribir aplicaciones web en lugar de aplicaciones de escritorio (y utilizarlos como aplicaciones de escritorio - es decir, iniciar el servidor en el equipo donde Me refiero a usar la aplicación, abrir la página en un navegador y tratarla como una aplicación de escritorio, si hay algo que no puedo hacer en JavaScript, como acceder a la red, etc., lo hago en el servidor). Esto tiene la ventaja de una gran portabilidad (en este momento, esto significa que desarrollo en Linux usando SBCL y lo despliego en Windows usando Clozure CL, y hasta ahora funciona muy bien).

Actualmente estoy bastante contento con el progreso de dicha aplicación, utilizando Hunchentoot (a alojar el contenido) + Parenscript (a CLize JavaScript) + JQuery (domesticar incompatibilidades del navegador) + JQueryUI (a domesticar la escritura de interfaz de usuario en los navegadores) No se preocupe por el rendimiento de JS, es pretty spectacular en estos días (bueno, si puede permitirse ignorar IE antes que IE9 y usar un navegador reciente). Hace unas semanas escribí a simple 'hello world'-type application usando todos estos (excepto JQueryUI, pero eso es fácil de agregar); podría ser útil como un ejemplo mínimo de lo que quiero decir.

1

He jugado con algunas de las sugerencias hasta ahora, en mi experiencia las uniones Qt y Gtk hacen el trabajo, pero todavía se sienten un poco C/C++ - ish, que no me gusta. Jugué con la versión gratuita de LispWorks y quedé muy impresionado con CAPI, pero no tengo ninguna necesidad (y capacidad) de invertir en una licencia comercial en este momento, así que nunca he hecho otra cosa que jugar con el ejemplo aplicaciones.

Voy a secundar la recomendación de buscar en las IU basadas en web. Por mucho que no me gusta programar el navegador, hoy en día hay muchas herramientas para que sea tolerable, y tal vez incluso agradable, y Restas (un marco basado en Hunchentoot) es bastante agradable.

1

Además de la ya mencionada LTK (que siempre funcionó bien para mí), también soy aficionado a Cells-Gtk, porque Tilton de Cells son, en mi opinión, una buena aproximación a la escritura de código GUI. (Aún así, LTK podría ser más fácil para empezar).

Por ejemplo, aquí hay un código para un convertidor Fahrenheit/Celsius muy simple (y viceversa) que escribí cuando recién comenzaba con Cells-Gtk:

(defun fahrenheit->celsius (fahrenheit/string) 
    (princ-to-string (handler-case 
         (* (- (read-from-string fahrenheit/string nil) 32) 5/9) 
        (error() "NaN")))) 

(defun celsius->fahrenheit (celsius/string) 
    (princ-to-string (handler-case 
         (+ (* (read-from-string celsius/string nil) 9/5) 32) 
        (error() "NaN")))) 

(defmd celsius-fahrenheit-converter (gtk-app) 
    :title "°C <-> °F" 
    :position :center 
    :kids 
    (kids-list? 
    (mk-vbox 
    :kids 
    (kids-list? 
    (mk-hbox 
     :kids 
     (kids-list? 
     (mk-entry :md-name :celsius 
       :init "0" 
       :text (c? (fahrenheit->celsius (widget-value :fahrenheit)))) 
     (mk-label :text "°C"))) 
    (mk-hbox 
     :kids 
     (kids-list? 
     (mk-entry :md-name :fahrenheit 
       :text (c? (celsius->fahrenheit (widget-value :celsius)))) 
     (mk-label :text "°F"))))))) 

no hay un botón "Calcular" o algo por el estilo - apenas cambie el valor de un campo de entrada y el otro se actualizará sobre la marcha. Como puede ver, Cells maneja los cambios de estado de los widgets de forma automática, solo debe proporcionarse la "tubería" correcta.

(Este código es un par de años, y no tengo ninguna instalación de células-GTK para probarlo cajero automático, pero es utilizado para que funcione correctamente cuando la escribí.)

Cuestiones relacionadas