如何将GUI改装为现有的C程序?

我一直致力于一个移植旧的solaris CL程序以在Linux上运行的项目,并禁止一些不相关的硬件问题,这已经完成。 现在我想要一个GUI,因此用户可以选择带有下拉菜单和复选框的各种选项,以及一些不受限制的选项的文本输入区域,如文件名。 (该程序是运行一些光谱扫描仪并将结果存储为CSV文件的内部工具。它处理所有这些选项,运行扫描仪并处理信息并使用指定的文件名存储它;我只想要比CL更好的使用。 )

我见过这样的事情的唯一一次是一个PyGTK + GUI与C代码的python绑定(我认为它是什么;这是我的第一个学期合作,我不太了解!)。 这比我现在要进入的要多一点; 有一个相对简单的方法来做到这一点? 当我用Google搜索时,我找到了SWIG( http://www.swig.org/index.php ); 这是一个好方法吗?

这听起来就像Tcl / Tk的设计目标。 它有一个非常简单的C API,允许您使用回调注册命令。 如果在Tcl程序中使用该命令,它将调用回调并提供一种机制来转换Tcl列表(本机数据结构)和char *的ARGV样式数组之间的参数。

它专门设计用于轻松地将这种包装器改装为命令行驱动的C程序。 您还可以使用各种其他模式来连接解释器,并且很容易将程序作为脚本语言嵌入。 从内存中可用的接口机制是:

  • 在Tcl解释器中注册命令
  • 在您的程序中嵌入一个Tcl解释器并使用Tcl作为嵌入式脚本语言(可能包括命令的注册和程序的回调)
  • 使用全双工管道生成进程并通过stdin / stdout发送命令(您还可以将事件处理程序附加到数据可用时调用的管道)
  • 减少Tcl特定机制,例如fork / exec或通过套接字连接。

Ousterhout的书Tcl和TK Toolkit有点陈旧,但有很好的C API指南。 Welch 在Tcl / Tk中的实用编程是另一本经典的Tcl / Tk书籍,并且更新频率更高。 互联网上还有其他几本书和相当多的电子资源。 一些好的起点是: Tcl教程 , TK教程 , Tcl倡导网站 (可能值得仔细阅读以帮助您决定是否要沿着这条路走下去), Tcl / Tk Wiki以及Stackoverflow 。

TK将为您提供简单的GUI,并且很容易学习编程 – 如果有点简单。 如果你花一些时间调整外观或使用像Tile这样的主题引擎,它就不像以前那么难看 。

正如Norman Ramsey 指出的那样(+ 1) ,另一种使用简单C API的替代方案是Lua。 两者都有优点和缺点。 Tcl的主要优势在于简单而干净整合的TK工具包以及来自第三方库(例如Tix )的良好,成熟的支持。 Lua的主要优点是语言更好,但没有标准的GUI工具包,因此UI没有很好地集成。 Lua也为解释器中的线程提供了更好的支持,这是从头开始为此设计的。 但是,如果要包装旧版C / unix应用程序,则这不太可能是一个重要function。

WXWidgets比TK复杂得多,运行时间更长,但function更丰富。

如果您有充分的理由认为您的脚本项目将成长为更大的应用程序,您可能会考虑Lua。 但是,在更大规模上,您将进入一个实质性的开发项目, Python或Ruby开始成为可行的选择。 随着项目变得越来越大,C代码库将占整个项目的一小部分,第三方库支持将是一个更大的考虑因素。

如果您使用Tcl并发现您的项目有自己的生命,请考虑嵌入Tcl解释器并将应用程序重新转换为插件API,人们可以将自己的脚本挂钩。 额外的function可以作为脚本完成,并可能在第三方进行维护。 具有内置脚本语言的系统的一个优点是,您个人不一定必须实现function。 人们可以用脚本语言编写自己的扩展,或让第三方为他们做。

SWIG旨在生成库周围的包装器。 它解析头文件并生成一个粘合层,以目标语言呈现本机API。 要使用它,您必须将程序重新分配到库中。

正如其他人所说,Tcl / Tk是一个不错的选择。 您将面临超出Tcl语言的风险,但Tk窗口工具包的出色function和简单性可以降低这种风险。

我会考虑的另一个选择是wxlua 。 原因是Lua是一种你不会长大的语言 。 您可能也更喜欢wxlua,因为它基于wxwidgets ,它将为您提供GUI 本机外观 。 最初的Tk有一种相当奇怪且非常原生的外观和感觉,但现在情况要好得多,所以这个原因可能不会带来太大的影响。 您可以查看两个GUI工具包以查看有什么吸引力。 您可能更喜欢Lua的最后一个原因是, 将用户定义的数据类型公开给GUI和脚本更容易

我不会考虑像Python和Gtk +这样的替代品,因为那里有所有替代品, 只有Tcl和Lua从一开始就被设计为与C程序结合

你也问过SWIG 。 虽然它表面上很吸引人,但我建议避免使用它。 Tcl和Lua都有非常简单的C API ,如果您学会自己使用本机API而不是让SWIG为您生成代码,您将学到更多,更好地理解并更好地控制您的应用程序。

我之前使用tcl / tk来包装较小的CLI程序,它通常可以正常工作。

tcl / tk是一个脚本语言/包,它将调用和解析CLI输出,因此您不必编写新程序

的Tcl / Tk

怎么样Tcl / Tk ..充足的资源..比如这个

我要第二个Tcl / Tk。 对于用Fortran / C / C ++编写的遗留程序,我做了同样的事情。 由于在Tcl / Tk中编写DSL非常简单,我最终只是为程序添加了一个选项,用于输出DSL(主要是在proc中编写的Tcl命令),用于tk程序到eval。 我已经为一个程序做了这个,它在tkcanvas上做了相当复杂的图形动画,可以选择在大约4小时内以mpeg的forms保存部分动画。 人们都很惊讶。 它也是完全便携的。 Tcl / Tk具有简单但复杂的事件驱动设施(其简单性仍然是无与伦比的)来编写GUI应用程序。 只要可以从标准输入读取并写入标准输出,您就可以使用简单管道与旧程序进行交互。

这种方法的巨大优势在于您无需将任何GUI或其他库与旧程序链接,这有时是不可能的。 GUI和遗留程序可以完全分离。

那是大约10年前的事了。 从那时起,Tk已经发展/改进了很多,并获得了原生的外观和感觉能力。

过去主要的缺点是打包标准的Tcl / Tk程序,现在也很大程度上解决了这个问题。

编辑: DSL代表“领域特定语言”扩展到Tcl解释器表现为新的语言关键字。 Tcl有一个相当基本的语法,所以这个机制允许扩展语言的很大范围。 使用Tcl执行此操作的应用程序的一个很好的示例是Expect。

由于您已经熟悉PyGTK,为什么不使用Gtk + ? 毕竟,PyGTK只是围绕Gtk +绑定,用C语写。

它的跨平台也是如此。 因此,如果您使用GLib,您的应用程序几乎可以运行。

任何工具包或框架都可以解决您的问题,因为您正在请求一个用作命令行可执行文件包装器的UI。 您可以选择C#,MFC,VB6,任何您想要的工具。 对于命令行UI包装器,基于.NET的语言(如C#)非常容易。 如果您想在C ++中使用wxWidgets,Qt或Ultimate ++可以帮助您。

如果你知道如何在C中编程,你可以在普通的Win32 API中完成,尽管你必须管理一些在C ++框架中自动处理的东西。

您可以使用任何您喜欢的工具包(tcl / tk或您熟悉的具有GUIfunction的任何其他脚本语言),但建议将原始文件保留为CLI程序(然后在从用户收集选项后运行GUI ) 很好。 无需进入C绑定等。

如果您的程序需要文本模式UI, TxWin是一个不错的选择。

另一个, TVision是gool ol’Borland TurboVision的克隆版。

在不推荐特定库或GUI工具包的情况下,请注意大多数GUI都在“事件驱动”模型上工作。

这意味着大多数情况下应用程序正在执行以下操作:

  1. 等待事件(例如键盘输入,定时器到期等)
  2. 根据该事件调用一些用户指定的函数
  3. 循环回到第1步。

如果被调用的函数花费大量时间,则会使程序无响应。

解决这个问题意味着让你的GUI在另一个线程中处理,或者长期存在的函数偶尔会产生检查用户是否试图中止它们的能力。

我认为MGUI是你可以使用的东西!

MGui(MORELLO图形用户界面)是一个用ANSI C编写的跨平台图形用户界面,也通过框架库提供C ++ API。 它由一个库组成,包括所有典型的GUI对象,如菜单,按钮,可编辑字段,列表等……以及代码生成工具(MGui Designer),允许用户使用鼠标创建和维护应用程序窗口布局。

MGui可以为Windows 3.1,Windows 95/98 / NT,Unix X-Window,DOS(Borland,Watcom和DJGPP)创建应用程序,而不了解主机系统图形API。 您可以简单地使用MGui Designer代码生成器来创建窗口布局,并编写代码以与创建的对象进行交互。

对于其function,MGui对于想要实现多平台应用程序的每个人都很有用,完全没有GUI移植需求。 它非常适合在实模式和DPMI中基于DOS的嵌入式系统中使用。

顺便说一下, 这是一个非常好的库列表。