Compositional widgets for terminal user interfaces, written in Go, inspired by urwid.
Gowid provides widgets and a framework for making terminal user interfaces. It's written in Go and inspired by urwid.
Widgets out-of-the-box include:
All widgets support interaction with the mouse when the terminal allows.
Gowid is built on top of the fantastic tcell package.
There are many alternatives to gowid - see Similar Projects
The most developed gowid application is currently termshark, a terminal UI for tshark.
go get github.com/gcla/gowid/...
Make sure
$GOPATH/binis in your PATH (or
~/go/binif
GOPATHisn't set), then tab complete "gowid-" e.g.
gowid-fib
Here is a port of urwid's palette example:
Here is urwid's graph example:
And urwid's fibonacci example:
A demonstration of gowid's terminal widget, a port of urwid's terminal widget:
Finally, here is an animation of termshark in action:
This example is an attempt to mimic urwid's "Hello World" example.
package mainimport ( "github.com/gcla/gowid" "github.com/gcla/gowid/widgets/divider" "github.com/gcla/gowid/widgets/pile" "github.com/gcla/gowid/widgets/styled" "github.com/gcla/gowid/widgets/text" "github.com/gcla/gowid/widgets/vpadding" )
//======================================================================
func main() {
palette := gowid.Palette{ "banner": gowid.MakePaletteEntry(gowid.ColorWhite, gowid.MakeRGBColor("#60d")), "streak": gowid.MakePaletteEntry(gowid.ColorNone, gowid.MakeRGBColor("#60a")), "inside": gowid.MakePaletteEntry(gowid.ColorNone, gowid.MakeRGBColor("#808")), "outside": gowid.MakePaletteEntry(gowid.ColorNone, gowid.MakeRGBColor("#a06")), "bg": gowid.MakePaletteEntry(gowid.ColorNone, gowid.MakeRGBColor("#d06")), } div := divider.NewBlank() outside := styled.New(div, gowid.MakePaletteRef("outside")) inside := styled.New(div, gowid.MakePaletteRef("inside")) helloworld := styled.New( text.NewFromContentExt( text.NewContent([]text.ContentSegment{ text.StyledContent("Hello World", gowid.MakePaletteRef("banner")), }), text.Options{ Align: gowid.HAlignMiddle{}, }, ), gowid.MakePaletteRef("streak"), ) f := gowid.RenderFlow{} view := styled.New( vpadding.New( pile.New([]gowid.IContainerWidget{ &gowid.ContainerWidget{IWidget: outside, D: f}, &gowid.ContainerWidget{IWidget: inside, D: f}, &gowid.ContainerWidget{IWidget: helloworld, D: f}, &gowid.ContainerWidget{IWidget: inside, D: f}, &gowid.ContainerWidget{IWidget: outside, D: f}, }), gowid.VAlignMiddle{}, f), gowid.MakePaletteRef("bg"), ) app, _ := gowid.NewApp(gowid.AppArgs{ View: view, Palette: &palette, }) app.SimpleMainLoop()
}
Running the example above displays this:
Gowid is late to the TUI party. There are many options from which to choose - please read https://appliedgo.net/tui/ for a nice summary for the Go language. Here is a selection:
Gowid depends on these great open-source packages: