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

时间:2008-12-21 23:17:32

标签: c user-interface tcl

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

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

11 个答案:

答案 0 :(得分:17)

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

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

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

Ousterhout的书Tcl and the TK Toolkit有点陈旧,但有很好的C API指南。 Welch的Practical Programming in Tcl/Tk是另一本经典的Tcl / Tk书籍,更新频率更高。互联网上还有several other books和相当多的电子资源。一些好的起点是:Tcl tutorialTK tutorialTcl advocacy site(可能值得仔细阅读以帮助您决定是否要沿着这条路走下去),Tcl/Tk Wiki当然Stackoverflow

TK将为您提供简单的GUI,并且非常容易学习编程 - 如果有点简单。如果您花一些时间ugly as it used to be或使用tweak the appearance

等主题引擎,则不是Tile.

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

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

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

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

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

答案 1 :(得分:4)

正如其他人所说,Tcl / Tk是一个不错的选择。有一个真正的风险,你将超过Tcl语言,但这种风险可以通过Tk窗口工具包的优秀<强大和简单性来减轻。

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

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

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

答案 2 :(得分:3)

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

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

tcl/tk

答案 3 :(得分:3)

Tcl / Tk怎么样?有足够的资源......比如this

答案 4 :(得分:3)

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

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

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

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

编辑: DSL代表'Domain Specific Language'对Tcl解释器的扩展将自己显示为新的语言关键字。 Tcl有一个相当基本的语法,所以这个机制允许扩展语言的很大范围。使用Tcl执行此操作的应用程序的一个很好的示例是Expect.

答案 5 :(得分:1)

既然您已熟悉PyGTK,为什么不使用Gtk+?毕竟,PyGTK只是围绕Gtk +绑定,用C语言编写。

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

我认为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代码生成器来创建窗口布局,并编写代码以与创建的对象进行交互。

     

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

顺便说一句,here是一个很好的lib列表。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

如果您的程序需要文本模式用户界面,TxWin是个不错的选择。

另一个,TVision是一个名为“Borland TurboVision”的克隆人。

答案 10 :(得分:0)

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

这意味着应用程序大部分时间都是这样做的:

  1. 等待事件(例如键盘输入,计时器到期等)
  2. 根据该事件调用一些用户指定的函数
  3. 循环回到第1步。
  4. 如果被调用的函数花费大量时间,则会使程序无响应。

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

相关问题