非常简单、简洁且易于理解的GUI编程“框架”

61

请列出允许快速编写GUI应用程序的GUI编程库、工具包和框架。我的意思是以这样的方式描述GUI,即:

  • GUI完全在一个可读(和可写)的纯文本文件(代码)中描述
  • 代码简洁(每个小部件/事件对只有1或2行代码),适合脚本编写
  • GUI的结构和操作从代码中明显(小部件的嵌套和事件流)
  • 有关如何构建GUI的详细信息被隐藏(例如主循环、附加事件侦听器等)
  • 支持自动布局(vbox、hbox等)

正如答案所示,这可以被定义为“声明性”GUI编程,但不一定如此。任何方法都可以,只要它有效,易于使用且简洁。

有一些类似这样的GUI库/工具包。它们如下所示。如果您发现符合条件的工具包缺失,请扩展列表。如果可能,请指明该项目是否跨平台、成熟、活跃,并给出一个示例。

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

到目前为止,以下是列表(按字母顺序排列):

Fudgets

Fudgets是一个Haskell库。平台:Unix。状态:实验性的,但仍在维护。示例:

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

Fudgets example screenshot
(来源:picamatic.com)

GNUstep Renaissance

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> 

Renaissance example screenshot
(来源:picamatic.com)

HTML

基于HTML和JS的GUI。跨平台、成熟稳定,可以完全在客户端使用。

寻找一个漂亮的“helloworld”例子。

HTML GUI example
(来源:picamatic.com)

JavaFX

JavaFX 既可用于独立的(桌面)应用程序,也可用于 Web 应用程序。它不完全跨平台,且尚未完全开源。状态:1.0 发布版。下面是一个示例:

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

需要截图。

Phooey

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 example screenshot
(来源:picamatic.com)

PythonCard

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

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

PythonCard example screenshot
(来源:picamatic.com)

Shoes

Shoes是Ruby的GUI库。平台: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 example screenshot
(来源:picamatic.com)

tekUI

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 screenshot
(来源:picamatic.com)

Treethon

Treethon 是针对 Python 的 GUI 框架。它使用 YAML 文件来描述图形用户界面(Python in a YAML tree)。支持平台: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

尚未命名的Python库,由Richard Jones开发:

这个库还没有发布。其想法是使用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

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 example
(来源:picamatic.com)


感谢您的贡献!


可能适合作为社区 Wiki。 - Wayne Koorts
好的,我已将其重新发布为社区维基。但我希望它不会提到非开源工具。 - sastanin
请问您能否添加结果的截图。 - OscarRyz
一些链接已经有了截图。但是,大多数这些库使用跨平台(或直接本地)低级工具包。所以它们在任何地方都具有更多或更少的本地外观。Tk、Fudgets 和 JavaFX 是不同的。 - sastanin
好的,我已经添加了截图。同时将问题重写为维基页面。 - sastanin
10个回答

16

说实话,HTML并不是儿戏。

它是跨平台的,并且可以用简单的文本文件概括GUI布局。它已经非常成熟了,而且被广泛理解和记录。

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

使用JavaScript进行客户端脚本编写,使用PHP / Ruby / Python / Perl进行服务器端脚本编写。

它并不适合所有目的,但对于许多用途来说,它已经足够好用了。它也不一定必须被服务端提供 - 如果需要,您可以直接向客户端分发HTML文件 - 可以参考TiddlyWiki这个例子。


2
基于Web的应用程序还好,但由于不可避免的客户端-服务器交互,整体复杂度更高。即使使用最新的Web和JS框架,每个“事件”的代码行数也更高。如果一个应用程序不完全是用户请求驱动的,事情会变得更加棘手。 - sastanin
我认为HTML是制作GUI的绝佳方式。你可以让它简单或相当复杂。我考虑过为文件对话框自己做这个,很可能很快就会去做。 - Rocketmagnet
2
你使用 TiddlyWiki 的例子让我相信它非常适合用于纯客户端 GUI。 - sastanin
我已经添加了一个链接到http://www.tiddlywiki.com/。 - jfs
HTML...对于处理大小在GB范围内的数据结构的重型CAD样式工具来说是不够的。你有什么想法? - Ninad

7
除了鞋子之外,您所描述的是声明式编程的新潮流。我更愿意将鞋子描述为GUI领域特定语言。好吧,我说新潮流:如果您查看Visual Basic表单后面的IDE设计器,它们就是声明式的。所以,更进一步,Oracle的SQL*Forms也是如此,尽管使用文本编辑器组装它们只能由非常勇敢的人来完成。
另外一个加入到列表中的是Microsoft的XAML,其中描述了为WPF构建的GUI等内容。
虽然提到的一些方案相当简单,但声明式定义的GUI可以像任何代码定义的GUI一样复杂,只不过更容易和更简洁:它们说明要发生的“是什么”,并将其留给底层框架来处理“如何”。

这是一个很好的回答,指出所有的例子都属于特定领域语言。不过,我想要具体的自由软件示例。 - sastanin
“声明式定义的GUI可以像代码中定义的任何内容一样复杂,只是更容易和更简洁。”在我看来,这一点非常正确。 - sastanin
这是否意味着Shoes在其余的框架中拥有更好的架构? - Ninad
1
@Ninad 我不确定什么是“更好”的 - 鞋子(可能最好在其green shoes版本中查看,该版本受到支持并在持续开发中)可能很难被引导到更复杂的、形式化的结构中。但这对于大多数“简单”框架来说可能都是真的。我认为只是需要找到最适合个人的方法。 - Mike Woodhouse

6

TCL/TK 是一种用于交互式构建图形用户界面的脚本语言,可在多个平台上使用,包括Unix、Windows和Mac OS X。


1
我了解Tk。它确实很简洁。但有一件让我避免使用它的事情是,Tk应用程序在我的Linux系统上看起来仍然像几年前一样“丑陋”。我不是在谈论不同的小部件集,而是字体的问题。虽然可能并不是Tk本身的问题,而是我的发行版的问题... - sastanin
瓷砖本地主题使Tcl/Tk再次变得漂亮。甚至有主题可以让它看起来像Gtk或Qt。http://wiki.tcl.tk/11075 - Daniel Lopez
我认为这个答案应该得到更高的投票,但是我不能再点赞了... - sastanin
3
最新版本的Tk已经解决了字体问题,现在支持反锯齿字体。就我个人而言,我更关注UI工具包的功能和生产力,而不是漂亮的字体,在这方面,Tk几乎没有对手。 - Bryan Oakley

3
Pyjamas - http://pyjs.org 是一个桌面小部件集,伪装成基于AJAX的Web 2.0小部件集。它与Web小部件集非常不同,以至于我实际上将其移植到了桌面上 - 使用的是WebKit(Adobe AIR、Google Chrome、Safari等中使用的相同引擎) - http://pyjd.org
以下是“Hello World”代码:
from pyjamas.ui.RootPanel import RootPanel
from pyjamas.ui.Button import Button
from pyjamas import Window
def greet(fred): Window.alert("Hello, AJAX!")
if __name__ == '__main__': b = Button("Click me", greet) RootPanel().add(b)
这满足前四个要求。此外,第五个需求可以通过以下代码实现:
from pyjamas.ui.RootPanel import RootPanel
from pyjamas.ui.HorizontalPanel import HorizontalPanel
from pyjamas.ui.HTML import HTML

p = HorizontalPanel()
p.add(HTML("<b>Hello</b>"))
p.add(HTML("World"))
RootPanel().add(p)
代码更加简单易懂。

这很有趣。我必须看一下它。谢谢! - sastanin

2

XUL(易于使用且功能强大——Firefox 的许多 GUI 结构都是使用 XUL 实现的,再配合逻辑处理的 JavaScript)。

XUL 教程提供了一些很好的示例。这里有一个关于选项卡盒子的示例,页面底部包含可切换的选项卡、按钮、编辑框和组框,而且非常简单(没有 JavaScript/CSS/XBL/键绑定等)。然后,他们会逐步添加更多 菜单 功能,尽管文件长度很短,但提供了很多功能(至少在你开始添加 JavaScript 处理相关逻辑之前如此)。如果我要在 Win32 中完成类似的操作,那将是一件真正的痛苦事情。


我在Mozilla之外没有看到任何易于使用的XUL使用示例。浏览其教程给人的印象是它过于XMLish和冗长,不适合快速简单的GUI开发。如果你能证明相反,我会非常感激。 - sastanin
我想我没有太多可以比较的东西,除了我使用过的各种win32工具和MATLAB的GUI;从那个角度来看,我发现XUL非常容易。也许你最好的选择是查看一个使用它的Firefox扩展。(让我找一个...) - Jason S
我的意思是有个例子... http://www.ibm.com/developerworks/web/library/wa-xul1/ - Jason S
你的选项卡和火狐扩展示例很有说服力。我会考虑的。 - sastanin
我还找到了一个关于使用XULRunner构建独立应用程序的教程:https://developer.mozilla.org/en/Getting_started_with_XULRunner - sastanin
是的,我忘了提到XULRunner。 :) 我想那很重要。我从来没有尝试过它,我一直使用Firefox来运行我的XUL(缺点是如果你的程序崩溃了,它会把浏览器也一起挂掉 :/)。 - Jason S

2

wxLua是一个将wxWidgets库封装到Lua中的工具。它使用Connect方法将GUI控件事件连接到函数上(函数类似于JS中的一等公民)。


2
GTK-server非常简单易用,可以在30多种语言中使用,包括Bash和Visual Basic。你可以通过GTK-server官网获得更多信息。

有趣的项目!我从未想过通过Unixy接口访问真实API - 我在基于命令行驱动的GUI方面的经验基本上仅限于kdialog。我想知道这是否可以推广到任何API。 - Iraimbilanja
1
这确实非常有趣。它似乎很适合脚本控制的GUI,但它看起来不够简洁。谢谢! - sastanin
它怎么可能比这个更简洁:http://www.gtk-server.org/demo-stdin.py.txt?顺便说一下,gtk-server也适用于Windows,这就为在Windows上运行GUI,但在Linux上运行逻辑等事情打开了大门,但我偏离了主题... - Jakob Eriksson
你可以说GTK。除非我误解了什么,它只是从字符串动态处理的C代码。它似乎比等效的C代码更复杂;这并不是我所谓的理想GUI框架。 - mbauman

2

SDL/Swing 是一种非常简洁、易读、不显眼(283k库,无依赖项)和易于使用的技术。例如:

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

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


1

1
看起来是一个有趣的领域特定语言。对于那些不跟随链接的人,需要注意的是,这里的SDL并不是指Simple Directmedia Layer。 - sastanin

-2

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


1
它不是免费的(开源)。即使有一个适用于Mono的XAML编译器(http://developer.novell.com/wiki/index.php/Xaml_compiler_for_mono),我也不确定它是否100%兼容或将保持这种状态。 - sastanin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接