Comment adapter une interface graphique à un programme C existant?

J’ai travaillé sur un projet de portage d’un ancien programme solaris CL sous Linux, et à l’exception de certains problèmes de matériel non liés, le travail est terminé. Maintenant, je veux une interface graphique, afin que l’utilisateur puisse choisir parmi les différentes options avec des listes déroulantes et des cases à cocher, ainsi que des zones de saisie de texte pour des options qui ne sont pas si restreintes, comme le nom du fichier. (Le programme est un outil interne permettant d’exécuter des spectroscanners et de stocker les résultats sous forme de fichiers CSV. Il gère toutes ces options, exécute les scanners, traite les informations et les stocke avec le nom de fichier spécifié. Je souhaite simplement utiliser quelque chose de plus agréable que CL. )

La seule fois où j’ai vu quelque chose comme ceci était une interface graphique PyGTK + avec des liaisons en python pour le code C (je pense que c’est ce que c’était; c’était mon premier semestre de co-opping et je ne comprenais pas beaucoup!). C’est un peu plus que ce que je veux entrer maintenant; Y a-t-il un moyen relativement facile de faire cela? Quand j’ai cherché sur Google, j’ai trouvé SWIG ( http://www.swig.org/index.php ); est-ce une bonne façon de faire?

    Cela ressemble exactement au travail pour lequel Tcl / Tk a été conçu. Il a une API C très simple qui vous permet d’enregistrer des commandes avec un rappel. Si vous utilisez la commande dans un programme Tcl, elle invoquera le rappel et fournira un mécanisme pour convertir les arguments entre une liste Tcl (structure de données native) et un tableau de type ARGV de type char *.

    Il a été conçu spécifiquement pour pouvoir intégrer facilement ce type d’emballage aux programmes C pilotés par ligne de commande. Il existe également une variété d’autres modes que vous pouvez utiliser pour interfacer l’interprète également, et il est facile de l’intégrer à des programmes en tant que langage de script. De mémoire les mécanismes d’interfaçage disponibles sont:

    • Enregistrer des commandes dans l’interpréteur Tcl
    • Intégrez un interpréteur Tcl dans votre programme et utilisez Tcl comme langage de script intégré (éventuellement, y compris l’enregistrement de commandes et de rappels à votre programme).
    • Créez un processus avec un canal en duplex intégral et envoyez des commandes via stdin / stdout (vous pouvez également attacher un gestionnaire d’événements au canal qui est appelé lorsque des données sont disponibles).
    • Moins de mécanismes spécifiques à Tcl tels que fork / exec ou la connexion via des sockets.

    Le livre d’Ousterhout, Tcl and TK Toolkit, est un peu démodé mais contient un bon guide pour l’API C. La programmation pratique de Welch en Tcl / Tk est l’autre livre classique sur Tcl / Tk et est mise à jour plus fréquemment. Il existe également plusieurs autres livres et de nombreuses ressources électroniques sur Internet. Quelques bons points de départ sont les suivants: tutoriel Tcl, tutoriel TK , site de plaidoyer Tcl (il peut être intéressant de vous consulter pour vous aider à décider si vous souhaitez suivre cette voie), Tcl / Tk Wiki et bien sûr Stackoverflow .

    TK vous donnera une interface graphique simple et est très facile à apprendre à programmer – même si c’est un peu simpliste. Ce n’est pas aussi moche qu’avant si vous prenez le temps de peaufiner l’apparence ou d’utiliser un moteur de thématisation tel que Tile.

    Comme le souligne Norman Ramsey (+1) , une autre alternative avec une API C simple est Lua. Les deux ont des avantages et des inconvénients. Les principaux atouts de Tcl sont la boîte à outils TK, simple et parfaitement intégrée, ainsi que la prise en charge efficace et mature des bibliothèques tierces (par exemple, Tix ). La principale force de Lua est que la langue est beaucoup plus agréable, mais il n’existe pas de boîte à outils GUI standard. L’UI n’est donc pas aussi bien intégrée. Lua supporte également beaucoup mieux le filetage dans l’interprète, car il a été conçu pour cela à partir de zéro. Toutefois, si vous encapsulez une application C / Unix héritée, il est peu probable que ce soit une fonctionnalité importante.

    WXWidgets est considérablement plus complexe que TK et offre plus de temps d’exécution, mais possède un ensemble de fonctionnalités plus riche.

    Si vous avez de bonnes raisons de penser que votre projet de script deviendra une application plus vaste, vous pouvez envisager Lua. Cependant, à plus grande échelle, vous êtes dans un projet de développement substantiel et Python ou Ruby commencent à devenir des options viables. Au fur et à mesure que le projet se généralisera, la base de code C constituera une partie moins importante du projet dans son ensemble et le support des bibliothèques tierces deviendra plus important.

    Si vous utilisez Tcl et découvrez que votre projet a une vie bien à elle, envisagez d’intégrer l’interpréteur Tcl et de transformer l’application en une API de plug-in permettant aux utilisateurs de créer leurs propres scripts. Des fonctionnalités supplémentaires peuvent être réalisées sous forme de scripts et éventuellement transférées à des tiers pour des raisons de maintenance. L’un des avantages d’un système avec un langage de script intégré est que vous ne devez pas personnellement implémenter de fonctionnalités. Les utilisateurs peuvent écrire leurs propres extensions dans le langage de script ou demander à des tiers de le faire pour eux.

    SWIG est conçu pour générer des wrappers autour des bibliothèques. Il parsing les fichiers d’en-tête et génère une couche de liaison qui présente une API native dans la langue cible. Pour l’utiliser, vous devrez re-factoriser votre programme dans une bibliothèque.

    Comme d’autres l’ont dit, Tcl / Tk est un bon choix. Il existe un risque réel de dépasser le langage Tcl , mais ce risque est atténué par l’excellent pouvoir et la simplicité de la boîte à outils de fenêtrage Tk .

    L’autre choix que je considérerais est wxlua . Les raisons sont que Lua est une langue que vous ne pourrez pas oublier . Vous pouvez également préférer wxlua car il est basé sur wxwidgets , ce qui vous donnera une apparence native . Le Tk original avait une apparence plutôt étrange et très peu autochtone, mais les choses vont beaucoup mieux maintenant, cette raison peut donc ne pas avoir beaucoup de force. Vous pouvez consulter les deux boîtes à outils de l’interface graphique pour voir quels sont les recours. Une dernière raison pour laquelle vous pourriez préférer Lua est qu’il est plus facile d’exposer des types de données définis par l’utilisateur à l’interface graphique et aux scripts.

    Je n’envisagerais pas d’alternatives telles que Python et Gtk +, en raison de toutes les alternatives existantes, seuls Tcl et Lua ont été conçus dès le début pour être mariés à des programmes en langage C.

    Vous posez également des questions sur SWIG . Bien qu’il soit superficiellement attrayant, je recommande de l’éviter. Tcl et Lua ont des API C très simples et vous en apprendrez plus, comprendrez mieux et maîsortingserez mieux votre application si vous apprenez à utiliser l’API native vous-même au lieu de demander à SWIG de générer du code pour vous.

    J’ai déjà utilisé tcl / tk pour envelopper des programmes CLI plus petits et cela fonctionne souvent très bien pour commencer.

    tcl / tk est un langage / package de script qui appellera et parsingra la sortie de la CLI afin que vous n’ayez pas à écrire un nouveau programme

    tcl / tk

    Que diriez-vous de Tcl / Tk .. beaucoup de ressources .. comme celle- ci

    Je dois seconder Tcl / Tk. J’ai fait exactement la même chose pour les anciens programmes écrits en Fortran / C / C ++. Comme il est très facile d’écrire un DSL dans Tcl / Tk, j’ai fini par append une option pour que le programme produise une sortie DSL (essentiellement des commandes Tcl écrites dans procs) pour le programme tk à eval. Je l’ai fait pour un programme permettant de faire des animations graphiques complexes sur un canevas tk, qui dispose d’options permettant de sauvegarder une partie de l’animation au format MPEG en environ 4 heures. Les gens étaient émerveillés. C’est complètement portable aussi. Tcl / Tk dispose d’installations simples, mais sophistiquées, pilotées par les événements (qui n’a toujours pas été simplifiées) pour écrire des applications avec une interface graphique. Vous pouvez utiliser un canal simple pour établir une interface avec les programmes existants, à condition qu’il puisse lire à partir d’une entrée standard et écrire sur une sortie standard.

    L’énorme avantage de cette approche est qu’il n’est pas nécessaire de lier une interface graphique ou des bibliothèques supplémentaires à vos programmes existants, ce qui est parfois impossible. L’interface graphique et le programme existant peuvent être complètement découplés.

    Et c’est il y a environ 10 ans. Tk a beaucoup évolué / amélioré depuis lors et a acquis une capacité native d’apparence et de convivialité.

    L’inconvénient majeur était d’empaqueter les programmes standard Tcl / Tk, ce qui est également en grande partie résolu.

    EDIT: DSL signifie ‘Domain Specific Language’ Les extensions de l’interpréteur Tcl se présentent sous la forme de nouveaux mots-clés. Tcl a une syntaxe assez basique, ce mécanisme laisse donc beaucoup de place à l’extension du langage. Un bon exemple d’application utilisant Tcl est Expect.

    Puisque vous connaissez déjà PyGTK, pourquoi ne pas utiliser Gtk + ? Après tout, PyGTK ne sont que des liaisons autour de Gtk +, qui est écrit en C.

    Sa multiplateforme, aussi. Donc, si vous utilisez GLib, votre application s’exécutera presque n’importe où.

    N’importe quel toolkit ou framework peut résoudre votre problème puisque vous demandez une interface utilisateur qui agit comme un wrapper pour votre exécutable en ligne de commande. Vous pouvez choisir C #, MFC, VB6 ou n’importe quel outil. Les langages basés sur .NET tels que C # sont assez faciles pour les wrappers d’interface utilisateur en ligne de commande. wxWidgets, Qt ou Ultimate ++ peuvent vous aider si vous souhaitez le faire en C ++.

    Si vous savez programmer en C, vous pouvez le faire avec une API Win32 standard, mais vous devez tout de même gérer certaines tâches traitées automatiquement dans les frameworks C ++.

    Vous pouvez utiliser n’importe quelle boîte à outils de votre choix (tcl / tk ou tout autre langage de script avec lequel vous avez une capacité graphique), mais il est conseillé de conserver l’original sous forme de programme CLI (que votre interface graphique exécute ensuite après la collecte des options de l’utilisateur ) est bon. Pas besoin d’entrer dans les fixations C etc.

    Si vous avez besoin d’une interface utilisateur en mode texte dans votre programme, TxWin est une bonne option.

    Un autre exemple, TVision , est un clone du projet Borland TurboVision.

    Sans commencer à recommander des bibliothèques ou des kits d’outils graphiques spécifiques, sachez que la plupart des interfaces graphiques fonctionnent sur un modèle “piloté par les événements”.

    Cela signifie que la plupart du temps, l’application effectue quelque chose comme ceci:

    1. attendre un événement (par exemple, saisie au clavier, expiration de la timer, etc.)
    2. appeler une fonction spécifiée par l’utilisateur en fonction de cet événement
    3. revenir en arrière à l’étape 1.

    Si la fonction appelée prend beaucoup de temps, votre programme ne répond plus.

    Pour contourner ce problème, vous devez avoir votre interface graphique gérée dans un autre thread ou la possibilité pour des fonctions à vie longue de permettre parfois de vérifier si l’utilisateur a essayé de les abandonner.

    Je pense que MGUI est une chose que vous pouvez aller avec!

    MGui (interface utilisateur graphique MORELLO) est une interface utilisateur graphique multiplate-forme écrite en C ANSI fournissant également une API C ++ via une bibliothèque de frameworks. Il se compose d’une bibliothèque, comprenant tous les objects graphiques typiques tels que menu, boutons, champs modifiables, listes, etc., ainsi que d’un outil de génération de code (MGui Designer), qui permet à l’utilisateur de créer et de gérer des dispositions de fenêtre d’application à l’aide de la souris.

    MGui permet de créer des applications pour Windows 3.1, Windows 95/98 / NT, Unix X-Window, DOS (Borland, Watcom et DJGPP) sans aucune connaissance de l’API graphique du système hôte. Vous pouvez simplement utiliser le générateur de code MGui Designer pour créer des dispositions de fenêtre et écrire votre code pour interagir avec les objects créés.

    Pour ses fonctionnalités, MGui est utile à tous ceux qui souhaitent réaliser des applications multi-plateformes, sans aucun besoin de portage graphique. Idéal pour une utilisation dans les systèmes embarqués basés sur DOS en mode réel et DPMI.

    À propos, voici une très bonne liste de bibliothèques.