transferencia - manual de interfaz gráfica de usuario en matlab parte 2
¿Cómo reajusto una GUI a un programa existente de C? (11)
¿Qué hay de Tcl / Tk ... un montón de recursos ... como este
He estado trabajando en un proyecto de portar un viejo programa CL de Solaris para ejecutarlo en Linux, y salvo algunos problemas de hardware no relacionados, eso está terminado. Ahora quiero una GUI para que el usuario pueda elegir entre las diversas opciones con menús desplegables y casillas de verificación, así como algunas áreas de entrada de texto para las opciones que no están tan restringidas, como el nombre del archivo. (El programa es una herramienta interna para ejecutar algunos escáneres de espectros y almacenar los resultados como archivos CSV. Maneja todas estas opciones, ejecuta los escáneres y procesa la información y la almacena con el nombre de archivo especificado, solo quiero algo mejor que CL. )
La única vez que he visto algo como esto hecho fue una interfaz gráfica de usuario PyGTK + con enlaces de python para el código C (creo que eso fue lo que fue; ¡fue mi primer semestre de cooperación y no entendí mucho!). Eso es un poco más de lo que quiero entrar en este momento; ¿Hay una manera relativamente fácil de hacer esto? Cuando busqué en Google encontré SWIG ( http://www.swig.org/index.php ); ¿Es esta una buena manera de ir?
Cualquier toolkit o framework puede resolver su problema ya que está solicitando una UI que actúe como un contenedor para su ejecutable de línea de comandos. Puede elegir C #, MFC, VB6, cualquier herramienta que desee. Los lenguajes basados en .NET como C # son bastante fáciles para los contenedores de interfaz de usuario de línea de comandos. wxWidgets, Qt o Ultimate ++ pueden ayudarte si quieres hacerlo en C ++.
Si sabe cómo programar en C, puede hacerlo en una API simple de Win32, aunque debe gestionar algunas cosas que se manejan automáticamente en los marcos de C ++.
He utilizado tcl / tk para ajustar programas CLI más pequeños antes y, a menudo, funciona bien para empezar.
tcl / tk es un lenguaje / paquete de scripts que llamará y analizará la salida CLI para que no tenga que escribir un nuevo programa
Puede usar cualquier kit de herramientas que le guste (tcl / tk o cualquier otro lenguaje de scripts con el que se sienta cómodo que tenga capacidad GUI), pero el consejo de mantener el original como un programa CLI (que su GUI luego ejecuta luego de recopilar opciones del usuario) ) es bueno. No es necesario entrar en enlaces C, etc.
Como otros han dicho, Tcl / Tk es una buena opción. Existe un riesgo real de que supere el lenguaje Tcl , pero ese riesgo se ve mitigado por la excelente potencia y simplicidad del kit de herramientas de ventanas Tk .
La otra opción que consideraría es wxlua . Las razones son que Lua es un idioma que no superarás . También puede preferir wxlua porque está basado en wxwidgets , lo que le dará a la GUI un aspecto y apariencia nativos . El Tk original tenía un aspecto y un tacto bastante extraños y muy no nativos, pero las cosas están mucho mejor ahora, por lo que esta razón puede no tener mucha fuerza. Puede consultar los dos kits de herramientas GUI para ver qué atrae. Una razón final por la que prefiere Lua es que es más fácil exponer los tipos de datos definidos por el usuario a la GUI y a los scripts.
No consideraría alternativas como Python y Gtk +, debido a todas las alternativas que existen, solo Tcl y Lua fueron diseñadas desde el principio para casarse con los programas C.
También preguntas sobre SWIG . Aunque es superficialmente atractivo, recomiendo evitarlo. Tanto Tcl como Lua tienen API C muy simples y aprenderá más, comprenderá mejor y tendrá un mejor control de su aplicación si aprende a usar la API nativa usted mismo en lugar de tener SWIG generando código para usted.
Sin entrar en la recomendación de bibliotecas específicas o kits de herramientas GUI, tenga en cuenta que la mayoría de las GUI funcionan en un modelo "impulsado por eventos".
Eso significa que la mayoría de las veces la aplicación está haciendo algo como esto:
- esperar por un evento (por ejemplo, entrada de teclado, vencimiento del temporizador, etc.)
- llamar a alguna función especificada por el usuario en función de ese evento
- regresa al paso 1.
Si la función que se llama toma una cantidad significativa de tiempo, hace que su programa no responda.
Trabajar en eso significa tener su GUI manejada en otro hilo, o la capacidad de funciones de larga duración ocasionalmente ceder para verificar si el usuario ha intentado abortarlas.
Tengo que secundar Tcl / Tk. Hice exactamente lo mismo con los programas heredados escritos en Fortran / C / C ++. Como es muy trivial escribir una DSL en Tcl / Tk, terminé simplemente agregando una opción para que el programa emita DSL (esencialmente comandos Tcl escritos en procs) para tk program to eval. Lo hice para un programa con animaciones de gráficos bastante complejas en un lienzo tk, que tiene opciones para guardar parte de la animación en mpeg en aproximadamente 4 horas. La gente estaba asombrada. Es completamente portátil también. Tcl / Tk tiene instalaciones simples, pero sofisticadas, impulsadas por eventos (que aún no tienen paralelo en su simplicidad) para escribir aplicaciones GUI. Puede usar una tubería simple para interactuar con programas heredados, siempre que pueda leer desde la entrada estándar y escribir en la salida estándar.
La gran ventaja de este enfoque es que no necesita vincular ninguna GUI o bibliotecas adicionales con sus programas heredados, que a veces es imposible. La GUI y el programa heredado se pueden desacoplar por completo.
Y eso fue hace unos 10 años. Tk ha evolucionado / mejorado mucho desde entonces y ha adquirido la capacidad de mirar y sentir nativa.
La principal desventaja solía ser el empaquetado de programas Tcl / Tk solo estándar, que ahora también se resuelve en gran parte.
EDITAR: DSL significa ''Lenguaje específico del dominio'' Las extensiones del intérprete Tcl se manifiestan como palabras clave de nuevo lenguaje. Tcl tiene una sintaxis bastante básica, por lo que este mecanismo permite un amplio margen para extender el lenguaje. Un buen ejemplo de una aplicación que hace esto con Tcl es Expect.
Esto suena exactamente como el trabajo para el que Tcl / Tk fue diseñado. Tiene una API C muy simple que le permite registrar comandos con una devolución de llamada. Si usa el comando en un programa Tcl, invocará la devolución de llamada y proporcionará un mecanismo para convertir los argumentos entre una lista Tcl (estructura de datos nativa) y una matriz de estilo ARGV de char *.
Fue diseñado específicamente para ser fácil de adaptar este tipo de envoltorio a los programas C de línea de comandos. También hay una variedad de otros modos que puede utilizar para interactuar con el intérprete, y es fácil de integrar en los programas como un lenguaje de scripting. Desde la memoria, los mecanismos de interfaz disponibles son:
- Registre los comandos en el intérprete Tcl
- Incorpore un intérprete Tcl en su programa y use Tcl como un lenguaje de scripting incorporado (posiblemente incluyendo el registro de comandos y devoluciones de llamada para su programa)
- Genere un proceso con un canal dúplex completo y envíe comandos a través de stdin / stdout (también puede adjuntar un controlador de eventos al conducto que se invoca cuando hay datos disponibles)
- Menos mecanismos específicos Tcl como fork / exec o conexión a través de sockets.
El libro de Ousterhout Tcl y el TK Toolkit están un poco anticuados, pero tienen una buena guía para la API de C. La Programación práctica de Welch en Tcl / Tk es el otro libro clásico de Tcl / Tk y se actualiza con más frecuencia. También hay varios otros libros y bastantes recursos electrónicos en Internet. Algunos buenos puntos de partida son: tutorial de Tcl , tutorial de TK , sitio de defensa de Tcl (podría valer la pena examinarlo detenidamente para ayudarlo a decidir si desea seguir esta ruta), Tcl / Tk Wiki y, por supuesto, .
TK le dará una GUI sencilla y es muy fácil de aprender a programar, aunque un poco simplista. No es tan feo como solía ser si te tomas un tiempo para modificar la apariencia o usar un motor de entonación como Tile.
Como señala Norman Ramsey (+1) , otra alternativa con una simple API C es Lua. Ambos tienen ventajas y desventajas. Las principales fortalezas de Tcl son el conjunto de herramientas TK simple y perfectamente integrado y el soporte de soporte bueno y maduro de bibliotecas de terceros (por ejemplo, Tix ). La principal fortaleza de Lua es que el lenguaje es mucho más agradable, pero no hay un conjunto de herramientas GUI estándar, por lo que la interfaz de usuario no está tan bien integrada. Lua también tiene mucho mejor soporte para enhebrar en el intérprete, ya que ha sido diseñado para esto desde cero. Sin embargo, si está envolviendo una aplicación heredada C / Unix, es poco probable que sea una característica importante.
WXWidgets es considerablemente más complejo que TK y lleva más equipaje de tiempo de ejecución, pero tiene un conjunto de funciones más completo.
Si tiene una razón genuina para pensar que su proyecto de scripting se convertirá en una aplicación más grande, podría considerar Lua. Sin embargo, a una escala más grande te interesa un proyecto de desarrollo sustancial y Python o Ruby comienzan a ser opciones viables. A medida que el proyecto se va ampliando, la base de código C será una porción más pequeña del proyecto general y el soporte de la biblioteca de terceros será una consideración más importante.
Si elige Tcl y descubre que su proyecto adquiere vida propia, considere incorporar el intérprete Tcl y volver a convertir la aplicación como una API de complemento en la que las personas puedan enganchar sus propios scripts. Las características adicionales se pueden realizar como scripts y, posiblemente, se quiten a terceros para el mantenimiento. Una de las ventajas de un sistema con un lenguaje de scripting incorporado es que usted personalmente no necesariamente tiene que implementar funciones. Las personas pueden escribir sus propias extensiones en el lenguaje de scripting u obtener terceros para que lo hagan por ellos.
SWIG está diseñado para generar envoltorios alrededor de las bibliotecas. Analiza los archivos de encabezado y genera una capa de pegamento que presenta una API nativa en el idioma de destino. Para usarlo, debería volver a factorizar su programa en una biblioteca.
¡Creo que MGUI es algo con lo que puedes ir!
MGui (interfaz gráfica de usuario MORELLO) es una interfaz gráfica de usuario multiplataforma escrita en ANSI C, que también proporciona una API C ++ a través de una biblioteca de marcos. Consiste en una biblioteca, que incluye todos los objetos típicos de GUI como menú, botones, campos editables, listas, etc. y una herramienta de generación de código (MGui Designer), que permite al usuario crear y mantener diseños de ventanas de aplicaciones con el mouse.
MGui hace posible crear aplicaciones para Windows 3.1, Windows 95/98 / NT, Unix X-Window, DOS (Borland, Watcom y DJGPP) sin conocimiento de la API gráfica del sistema host. Simplemente puede usar el generador de código de MGui Designer para crear diseños de ventanas y escribir su código para interactuar con los Objetos creados.
Por sus características, MGui es útil para todos los que quieran realizar aplicaciones multiplataforma, sin necesidad de portar GUI. Es ideal para usar en sistemas integrados basados en DOS tanto en modo real como en DPMI.
Por cierto, aquí hay una muy buena lista de libs.