Please list GUI programming libraries, toolkits, frameworks which allow to write GUI apps quickly. I mean in such a way, that
As answers suggest, this may be defined as declarative GUI programming, but it is not necessarily such. Any approach is OK if it works, is easy to use and terse.
There are some GUI libraries/toolkits like this. They are listed below. Please extend the list if you see a qualifying toolkit missing. Indicate if the project is crossplatform, mature, active, and give an example if possible.
Please use this wiki to discuss only Open Source projects.
This is the list so far (in alphabetical order):
Fudgets is a Haskell library. Platform: Unix. Status: Experimental, but still maintained. An example:
import Fudgets
main = fudlogue (shellF "Hello" (labelF "Hello, world!" >+< quitButtonF))
(source: picamatic.com)
Renaissance allows to describe GUI in simple XML. Platforms: OSX/GNUstep. Status: part of GNUstep. An example below:
<window title="Example">
<vbox>
<label font="big">
Click the button below to quit the application
</label>
<button title="Quit" action="terminate:"/>
</vbox>
</window>
(source: picamatic.com)
HTML-based GUI (HTML + JS). Crossplatform, mature. Can be used entirely on the client side.
Looking for a nice “helloworld” example.
(source: picamatic.com)
JavaFX is usable for standalone (desktop) apps as well as for web applications. Not completely crossplatform, not yet completely open source. Status: 1.0 release. An example:
Frame {
content: Button {
text: "Press Me"
action: operation() {
System.out.println("You pressed me");
}
}
visible: true
}
Screenshot is needed.
Phooey is another Haskell library. Crossplatform (wxWidgets), HTML+JS backend planned. Mature and active. An example (a little more than a 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)
(source: picamatic.com)
PythonCard describes GUI in a Python dictionary. Crossplatform (wxWidgets). Some apps use it, but the project seems stalled. There is an active fork.
I skip PythonCard example because it is too verbose for the contest.
(source: picamatic.com)
Shoes for Ruby. Platforms: Win/OSX/GTK+. Status: Young but active. A minimal app looks like this:
Shoes.app {
@push = button "Push me"
@note = para "Nothing pushed so far"
@push.click {
@note.replace "Aha! Click!"
}
}
(source: picamatic.com)
Tcl/Tk. Crossplatform (its own widget set). Mature (probably even dated) and active. An example:
#!/usr/bin/env wish
button .hello -text "Hello, World!" -command { exit }
pack .hello
tkwait window .
(source: picamatic.com)
tekUI for Lua (and C). Platforms: X11, DirectFB. Status: Alpha (usable, but API still evolves). An example:
#/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()
(source: picamatic.com)
Treethon for Python. It describes GUI in a YAML file (Python in a YAML tree). Platform: GTK+. Status: work in proress. A simple app looks like this:
_import: gtk
view: gtk.Window()
add:
- view: gtk.Button('Hello World')
on clicked: print view.get_label()
This one is not released yet. The idea is to use Python context managers (with
keyword) to structure GUI code. See Richard Jones' blog for details.
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 may be used to create stand-alone desktop apps with XULRunner as well as Mozilla extensions. Mature, open source, crossplatform.
<?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>
(source: picamatic.com)
Thank your for contributions!
Not to kid, but HTML.
It's cross-platform, and sums up the gui-layout in a simple textfile. It's definitely mature, as well as well-understood and well documented.
There's a bunch of ways to template HTML files for dynamic content, and other ways to convert custom syntaxes to HTML if you dislike angle-brackets.
Client-side scripting w/ Javascript, server-side scripting with PHP/Ruby/Python/Perl.
It's not well suited for all purposes, but for many, it's good enough. There's no reason that it has to be served either - you can distribute a HTML file to your clients if you want - see TiddlyWiki for a good example of where that can go.