Construyendo GUI de forma declarativa

Cuando hablaba de la herramienta RAD (Rapid Application Development) bajo Linux/Unix, solía usar Tk, que es una biblioteca bastante fácil para crear aplicaciones gráficas, para crear aplicaciones sencillas basadas en GUI, porque para mí, GTK, Qt o Java son demasiado complicado para ser utilizado para construir aplicaciones simples basadas en GUI. Tal vez están diseñados para construir complicados .

El concepto central de Tk es que las GUI se crean a partir de widgets: objetos como botones, ventanas, barras de desplazamiento y menús, que tienen atributos asociados (tamaño, color, leyendas, etc.). Los widgets se agrupan jerárquicamente dentro de una ventana de nivel superior...

La estructura general de un programa Tcl/Tk es definir la interfaz de usuario como una jerarquía de widgets con subrutinas ejecutadas por devoluciones de llamada. Los widgets aparecen en la pantalla cuando le pide a un administrador de geometría que los administre, o cuando invoca el comando de paquete (para cambiar el tamaño del elemento principal del widget para contenerlos).

-- Herramientas de desarrollo rápido de aplicaciones

La razón por la que cito arriba es para mostrar lo fácil que es codificar tales aplicaciones basadas en GUI a mano en Tk.

La idea clave es que "declara" la GUI, en lugar de dibujarla a mano (como en Visual Basic). Hay tantas herramientas GUI basadas en dibujos (como glade, etc.), pero muy pocas declarativas. Me pregunto qué son.

Mientras buscaba respuestas yo mismo, encontré que el siguiente es el tipo de herramientas de creación de GUI declarativas que estoy buscando (aunque no sé qué significa Oz). puede ver cómo se puede usar una declaración simple para crear ventanas, agregarles niños y hacer que reaccionen a la entrada del usuario, etc.

functor import Application(exit) System(show) GTK define %% Define Toplevel window class class MyToplevel from GTK.window meth new() GTK.window, new(GTK.'WINDOW_TOPLEVEL') GTK.window, setBorderWidth(10) GTK.window, setTitle("Hello, World!") {self signalConnect('delete-event' deleteEvent _)} end meth deleteEvent(Args) %% Do cleanup stuff here {System.show 'deleteEvent occured'} {Application.exit 0} end end %% Define HelloButton class class HelloButton from GTK.button meth new() GTK.button, newWithLabel("Hello, World!") GTK.button, signalConnect('clicked' clickedEvent _) end meth clickedEvent(Args) {System.show 'ClickedEvent occured'} end end %% Create Class Instances Toplevel = {New MyToplevel new()} Button = {New HelloButton new()} %% Make Butten child of Toplevel Container {Toplevel add(Button)} %% Make it all visible {Toplevel showAll()} end

Entonces, de nuevo, ¿cuáles son las herramientas populares de creación de GUI declarativas que existen? (En realidad, estoy más interesado en aquellos que funcionan con Go , pero esa no es la restricción de esta pregunta)

Gracias

Respuestas (2)

Hay una biblioteca llamada libui .

libui es una biblioteca GUI simple y portátil (pero no inflexible) en C que utiliza las tecnologías GUI nativas de cada plataforma que admite.

Cuando usa esta biblioteca, escribe un programa GUI en lugar de componentes GUI "arrastrar y soltar". No sé qué significa exactamente "declarar". Pero supongo que "declarar" son las palabras clave del código que son fáciles de entender. Esta biblioteca no solo está disponible para C sino también para Go . Aquí hay un programa GUI simple que tomé del tutorial de libui :

package main

import (
    "github.com/andlabs/ui"
)

func main() {
    err := ui.Main(func() {
        name := ui.NewEntry()
        button := ui.NewButton("Greet")
        greeting := ui.NewLabel("")
        box := ui.NewVerticalBox()
        box.Append(ui.NewLabel("Enter your name:"), false)
        box.Append(name, false)
        box.Append(button, false)
        box.Append(greeting, false)
        window := ui.NewWindow("Hello", 200, 100, false)
        window.SetChild(box)
        button.OnClicked(func(*ui.Button) {
            greeting.SetText("Hello, " + name.Text() + "!")
        })
        window.OnClosing(func(*ui.Window) bool {
            ui.Quit()
            return true
        })
        window.Show()
    })
    if err != nil {
        panic(err)
    }
}

Producirá un programa GUI como este:

ejemplo-libgui-go-programa

Esta es la mejor respuesta hasta ahora .

vaadin

Para construir la GUI de una aplicación web en Java puro, considere el marco de código abierto de Vaadin .

Vaadin funciona exactamente como lo describe, especificando en código el diseño de un formulario, agregando cada widget (etiquetas, campos, botones, etc.). Luego agrega fragmentos de código para que se ejecuten cuando el usuario manipula los widgets en tiempo de ejecución.

Vaadin es similar en idea a Java Swing, pero mucho más simple, mejor diseñado, mejor pensado y mucho más práctico y confiable.

Busque Preguntas similares aquí donde he publicado discusiones más detalladas sobre Vaadin.

Gracias Basil, encontré que "también funciona en cualquier pila basada en HTML5". Eso es una ventaja. Ah, y Vaadin Charts también (licencia comercial). Seguramente elegiría este si no hubiera habido una solución Go. Aún así, +1.
¿Cómo es esto declarativo?