12

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

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

4

11 回答 11

17

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

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

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

Ousterhout 的书Tcl and the TK Toolkit有点过时,但对 C API 有很好的指导。Welch's Practical Programming in Tcl/Tk是另一本经典的 Tcl/Tk 书籍,更新更频繁。互联网上还有其他几本书和相当多的电子资源。一些好的起点是:Tcl 教程TK 教程Tcl 倡导站点(可能值得仔细阅读以帮助您决定是否要走这条路)、Tcl/Tk Wiki,当然还有Stackoverflow

TK 会给你一个简单的图形用户界面,并且很容易学习编程——如果有点简单的话。如果您花一些时间来调整外观或使用诸如Tile之类的主题引擎,它就不像以前那么难看了。

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

WXWidgets 比 TK 复杂得多,并且承载更多运行时包袱,但具有更丰富的功能集。

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

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

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

于 2008-12-21T23:22:22.423 回答
5

正如其他人所说,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 为您生成代码,您将学到更多、更好地理解并更好地控制您的应用程序。

于 2008-12-22T04:20:24.770 回答
4

我必须第二个 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 代表 Tcl 解释器的“域特定语言” 扩展,它们表现为新的语言关键字。Tcl 具有相当基本的语法,因此这种机制为扩展语言提供了很大的空间。使用 Tcl 执行此操作的应用程序的一个很好的示例是Expect。

于 2008-12-22T04:00:35.450 回答
3

我以前使用 tcl/tk 来包装较小的 CLI 程序,而且它通常可以很好地开始。

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

tcl/tk

于 2008-12-21T23:20:43.440 回答
3

Tcl/Tk 怎么样 .. 大量的资源 .. 像这样

于 2008-12-21T23:23:05.060 回答
1

既然你已经熟悉 PyGTK,为什么不使用Gtk+呢?毕竟,PyGTK 只是围绕 Gtk+ 的绑定,它是用 C 编写的。

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

于 2008-12-21T23:20:36.063 回答
0

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

如果你知道如何用 C 编程,你可以用普通的 Win32 API 来做,尽管你必须管理一些在 C++ 框架中自动处理的事情。

于 2008-12-21T23:23:38.130 回答
0

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

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

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

就其特性而言,MGui 对任何想要实现多平台应用的人都非常有用,完全不需要 GUI 移植。它非常适合在基于 DOS 的嵌入式系统中以实模式和 DPMI 使用。

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

于 2008-12-21T23:24:32.793 回答
0

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

于 2008-12-21T23:27:31.930 回答
0

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

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

于 2008-12-21T23:30:07.963 回答
0

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

这意味着大多数时候应用程序都在做这样的事情:

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

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

解决这个问题意味着要么让你的 GUI 在另一个线程中处理,要么让长期存在的函数偶尔让步以检查用户是否试图中止它们。

于 2008-12-22T16:44:50.433 回答