60

请列出允许快速编写 GUI 应用程序的 GUI 编程库、工具包和框架。我的意思是这样的

  • GUI 完全在一个人类可读(和人类可写)的纯文本文件(代码)中描述
  • 代码很简洁(每个小部件/事件对 1 或 2 行代码),适用于脚本
  • 从代码中可以看出 GUI 的结构和操作(小部件的嵌套和事件流)
  • 隐藏了有关如何构建 GUI 的详细信息(诸如 mainloop、附加事件侦听器等)
  • 支持自动布局(vbox、hbox 等)

正如答案所暗示的那样,这可能被定义为声明式 GUI 编程,但不一定如此。如果可行,任何方法都可以,易于使用且简洁。

有一些像这样的 GUI 库/工具包。它们在下面列出。如果您发现缺少符合条件的工具包,请扩展该列表。指出项目是否跨平台、成熟、活跃,并在可能的情况下举例说明。

请使用此 wiki仅讨论开源项目。

这是到目前为止的列表(按字母顺序):

软糖

Fudgets是一个 Haskell 库。平台:Unix。状态:实验性,但仍保持。一个例子:

  import Fudgets
  main = fudlogue (shellF "Hello" (labelF "Hello, world!" >+< quitButtonF))

Fudgets 示例屏幕截图
(来源:picamatic.com

GNUstep 文艺复兴

Renaissance允许用简单的 XML 描述 GUI。平台:OSX/GNUstep。状态:GNUstep 的一部分。下面的一个例子:

<window title="Example">
  <vbox>
    <label font="big">
      Click the button below to quit the application
    </label>
    <button title="Quit" action="terminate:"/>
  </vbox>
</window> 

文艺复兴示例截图
(来源:picamatic.com

HTML

基于 HTML 的 GUI (HTML + JS)。跨平台,成熟。可以完全在客户端使用。

寻找一个不错的“helloworld”示例。

HTML 图形用户界面示例
(来源:picamatic.com

JavaFX

JavaFX可用于独立(桌面)应用程序以及 Web 应用程序。不完全跨平台,还没有完全开源。状态:1.0 版本。一个例子:

  Frame {
    content: Button {
      text: "Press Me"
      action: operation() {
         System.out.println("You pressed me");
      }
    }
    visible: true
  }

需要截图。

福伊

Phooey是另一个 Haskell 库。跨平台(wxWidgets),HTML+JS 后端计划。成熟而活跃。一个例子(比 helloworld 多一点):

  ui1 :: UI ()
  ui1 = title "Shopping List" $
        do a <- title "apples"  $ islider (0,10) 3
           b <- title "bananas" $ islider (0,10) 7
           title "total" $ showDisplay (liftA2 (+) a b)

Phooey 示例屏幕截图
(来源:picamatic.com

蟒蛇卡

PythonCard在 Python 字典中描述 GUI。跨平台(wxWidgets)。一些应用程序使用它,但该项目似乎停滞不前。有一个活跃的分叉。

我跳过PythonCard 示例,因为它对于比赛来说太冗长了。

PythonCard 示例截图
(来源:picamatic.com

鲁比鞋。平台:Win/OSX/GTK+。状态:年轻但活跃。一个最小的应用程序如下所示:

  Shoes.app {
     @push = button "Push me"
     @note = para "Nothing pushed so far"
     @push.click {
        @note.replace "Aha! Click!"
     }
  }

鞋子示例截图
(来源:picamatic.com

Tcl/Tk

Tcl/Tk。跨平台(它自己的小部件集)。成熟(甚至可能过时)和活跃。一个例子:

  #!/usr/bin/env wish
  button .hello -text "Hello, World!" -command { exit }
  pack .hello
  tkwait window .

Tcl/Tk 示例截图
(来源:picamatic.com

泰克UI

Lua(和 C)的tekUI。平台:X11、DirectFB。状态:Alpha(可用,但 API 仍在发展)。一个例子:

  #/usr/bin/env lua
  ui = require "tek.ui"
  ui.Application:new {
    Children = {
      ui.Window:new  {
        Title = "Hello",
        Children = {
          ui.Text:new {
            Text = "_Hello, World!", Style = "button", Mode = "button",
          },
        },
      },
    },
  }:run()

tekUI helloworld 截图
(来源:picamatic.com

树松

Python 的Treethon。它在 YAML 文件中描述 GUI(YAML 树中的 Python)。平台:GTK+。状态:进行中。一个简单的应用程序如下所示:

  _import: gtk
  view: gtk.Window()
  add:
      - view: gtk.Button('Hello World')
        on clicked: print view.get_label()

Treethon helloworld 截图 http://treethon.googlecode.com/svn/trunk/treethon_gtk_tutorial/base.png

Richard Jones 未命名的 Python 库:

这个还没有发布。这个想法是使用 Python 上下文管理器(with关键字)来构建 GUI 代码。有关详细信息,请参阅Richard Jones 的博客

with gui.vertical:
    text = gui.label('hello!')
    items = gui.selection(['one', 'two', 'three'])
    with gui.button('click me!'):
        def on_click():
            text.value = items.value
            text.foreground = red

许尔

XUL + Javascript 可用于创建带有 XULRunner 以及 Mozilla 扩展的独立桌面应用程序。成熟、开源、跨平台。

  <?xml version="1.0"?>
  <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
  <window id="main" title="My App" width="300" height="300"
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <caption label="Hello World"/>
  </window>

XUL helloworld 示例
(来源:picamatic.com


感谢您的贡献!

4

10 回答 10

16

不是小子,而是 HTML。

它是跨平台的,并在一个简单的文本文件中总结了 gui 布局。它绝对是成熟的,并且易于理解且有据可查。

有很多方法可以为动态内容模板化 HTML 文件,如果您不喜欢尖括号,还有其他方法可以将自定义语法转换为 HTML。

使用 Javascript 的客户端脚本,使用 PHP/Ruby/Python/Perl 的服务器端脚本。

它并不适合所有目的,但对许多人来说,它已经足够好了。也没有理由必须提供它 - 如果需要,您可以将 HTML 文件分发给您的客户 - 请参阅TiddlyWiki以了解可以去哪里的一个很好的例子。

于 2009-01-22T20:34:32.980 回答
7

您所描述的是,除了鞋子之外,声明式编程的新概念。我将鞋子更多地描述为一种 GUI领域特定语言。好吧,我说的是新奇的:Visual Basic 表单,如果你从 IDE 设计器后面看的话,它是声明性的。所以,再往前看,是 Oracle 的 SQL*Forms,尽管用文本编辑器组装它们是一个只有最勇敢的人才能进行的过程。

为了将另一个添加到列表中,Microsoft 拥有XAML,其中描述了为WPF构建的 GUI 。

虽然提到的一些方案相当简单,但声明式定义的 GUI 可以像代码中定义的任何东西一样复杂,但它们更简单、更简洁:它们说出你想要发生的“什么”并将其留给底层框架来处理“如何”。

于 2009-01-22T21:10:37.370 回答
6

TCL/TK是一种用于交互式构建 GUI 的脚本语言。它适用于各种平台,包括 Unix、Windows 和 Mac OS X。

于 2009-01-22T21:21:56.223 回答
3

睡衣 -http://pyjs.org - 这是一个桌面小部件集,伪装成基于 AJAX 的 web 2.0 小部件集。它非常不像网络小部件集,我实际上将它移植桌面 -http://pyjd.org - 使用 webkit(adobe AIR、google chrome、safari 等中的相同引擎)

这是“你好世界”:

从 pyjamas.ui.RootPanel 导入 RootPanel
从 pyjamas.ui.Button 导入按钮
从睡衣导入窗口

def 问候(弗雷德):
    Window.alert("你好,AJAX!")

如果 __name__ == '__main__':
    b = Button("点击我", 问候)
    RootPanel().add(b)

这立即回答了五个要求中的前四个。要求 5 通过以下方式满足:

从 pyjamas.ui.RootPanel 导入 RootPanel
从 pyjamas.ui.Horizo​​ntalPanel 导入 Horizo​​ntalPanel
从 pyjamas.ui.HTML 导入 HTML

p = 水平面板()
p.add(HTML("<b>你好</b>"))
p.add(HTML("世界"))
RootPanel().add(p)

它再简单不过了。

于 2009-04-08T17:30:03.503 回答
2

wxLua是 Lua 的 wxWidgets 库的包装器。它使用 Connect 方法将 gui 小部件事件附加到函数(函数是 JS 中的第一类)。

于 2009-01-26T17:14:14.183 回答
2

XUL(它非常易于使用,而且功能强大——大部分 Firefox 使用 XUL 实现 GUI 结构,+ javascript 用于逻辑处理)

XUL 教程有一些很好的例子。这是tabboxes的一个。页面底部有可切换的选项卡、按钮、编辑框和组框,而且相当简单(没有 Javascript/CSS/XBL/键绑定/等)。然后,他们稍后会逐渐 添加更多 内容,这对于指定它的文件的长度来说是很多功能。(至少在你开始添加 javascript 来处理有问题的逻辑之前)如果我不得不在 Win32 中做这样的事情,那将是一个真正的痛苦。

于 2009-01-22T20:56:33.777 回答
2

GTK-server使用起来非常简单,可以使用 30 多种语言,包括 Bash 和 Visual Basic。

于 2009-03-17T14:42:45.370 回答
2

SDL/Swing非常简洁、易读、不显眼(283k 库,没有依赖关系)并且易于使用。例子:

menus {
    "File" {
        "Open" do="open" // calls "open()" in the controller
        "---"
        "Exit" do="exit"
    }
}

它是开源的,但享有来自 Ikayzo.com 的商业支持。.NET 和 iOS 的端口正在进行中。

于 2010-06-08T13:37:44.147 回答
1

我今天遇到了SDL/Swing

于 2010-05-26T04:25:24.257 回答
-2

如果你在 .NET 平台上,你应该看看 XAML

于 2009-01-26T19:27:50.590 回答