Cross platform GUI in Go based on Material Design

Go API Reference 2.0.0 release Join us on Slack
Code Status Build Status Coverage Status

About

Fyne is an easy to use UI toolkit and app API written in Go. It is designed to build applications that run on desktop and mobile devices with a single codebase.

Version 2.0 is the current release of the Fyne API, this represented the first release since 1.0 that may break some API usage. It also added new features including data binding, animation, storage repositories and a new more flexible theme API. We also refreshed the default theme, adding animations, a focus colour and redesigning the Entry, Select, SelectEntry, ProgressBar and ProgressBarInfinite widgets. We are now working towards the next big release and more news will follow in our news feeds and GitHub project.

Prerequisites

To develop apps using Fyne you will need Go version 1.12 or later, a C compiler and your system's development tools. If you're not sure if that's all installed or you don't know how then check out our Getting Started document.

Using the standard go tools you can install Fyne's core library using:

$ go get fyne.io/fyne/v2

Widget demo

To run a showcase of the features of Fyne execute the following:

$ go get fyne.io/fyne/v2/cmd/fyne_demo/
$ fyne_demo

And you should see something like this (after you click a few buttons):

Fyne Hello Light Theme

Or if you are using the light theme:

Fyne Hello Light Theme

Getting Started

Fyne is designed to be really easy to code with. If you have followed the prerequisite steps above then all you need is a Go IDE (or a text editor).

Open a new file and you're ready to write your first app!

package main

import (
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
)

func main() {
	a := app.New()
	w := a.NewWindow("Hello")

	hello := widget.NewLabel("Hello Fyne!")
	w.SetContent(container.NewVBox(
		hello,
		widget.NewButton("Hi!", func() {
			hello.SetText("Welcome :)")
		}),
	))

	w.ShowAndRun()
}

And you can run that simply as:

go run main.go

It should look like this:

Fyne Hello Dark Theme Fyne Hello Dark Theme

Note that Windows applications load from a command prompt by default, which means if you click an icon you may see a command window. To fix this add the parameters -ldflags -H=windowsgui to your run or build commands.

Installing

Using go install will copy the executable into your go bin dir. To install the application with icons etc into your operating system's standard application location you can use the fyne utility and the "install" subcommand.

$ go get fyne.io/fyne/v2/cmd/fyne
$ fyne install

Packaging a release

Using the fyne utility "release" subcommand you can package up your app for release to app stores and market places. Make sure you have the standard build tools installed and have followed the platform documentation for setting up accounts and signing. Then you can execute something like the following, notice the -os ios parameter allows building an iOS app from macOS computer. Other combinations work as well :)

$ fyne release -os ios -certificate "Apple Distribution" -profile "My App Distribution" -appID "com.example.myapp"

The above command will create a '.ipa' file that can then be uploaded to the iOS App Store.

Documentation

More documentation is available at the Fyne developer website or on pkg.go.dev.

Examples

You can find many example applications in the examples repository. Alternatively a list of applications using fyne can be found at our website.

Comments
  • Add rounded edges to Rectangle

    Add rounded edges to Rectangle

    Description:

    #1090 Implementation of a (Round)Rectangle as primitive Open GLObject.

    • The property "fyne.RectangleRadius" extends canvas.Rectangle struct.
    • For the left and right side a different radius can be defined.
    • For the left and right side different segments can be defined. Default is 8 segments for one rounded edge of a rectange. The higher the value the more triangles are calculated and rendered.
    • A rectangle with stroke is rendered in one communication/stream to the GPU. A shape with opaque colors and stroke can be rendered with composition.
    • If radius is 0 a normal rectangle will be drawn.
    • Only required slices are rendered, so I hope the performance will be ok.

    Limitation: Shapes with stroke and only one segment don't work properly. As a work around for shapes with opaque colors you could use composition. As this is not the main use for this canvas object I don't plan to implement it.

    Checklist:

    • [x] Tests included.
    • [x] Formatter run with no errors.
    • [x] Lint run with no errors.
    • [x] Tests all pass.

    Where applicable:

    • [X] GL ES and software-fallback not implemented
    • [X] Please check: rendering (method: drawRectangle https://github.com/renlite/fyne/blob/c24f9a641cf0bf39f2e0c0da1694aed85132c239/internal/painter/gl/draw.go#L110) is called twice
    • [X] Old method: drawRectangle was commented out
    • [X] See last discussion #1090
    • [X] Example included. (https://github.com/renlite/fyne/blob/develop/example/flexrect.go)
  • FileDialog: Added list view

    FileDialog: Added list view

    Description:

    FileDialog: 3 Changes:

    • Added list view (with a toggle button to switch between views (grid or list)
    • Items are now hoverable
    • Adjusted filenames texts positions

    Fixes #2165 (partially)

    Checklist:

    • [X] Tests included.
    • [X] Lint and formatter run with no errors.
    • [X] Tests all pass.
  • Instant crash on iOS

    Instant crash on iOS

    https://user-images.githubusercontent.com/32988315/120218421-00aa8900-c23a-11eb-8456-37ea390e967d.mov

    Hi all!

    I compiled a little test app, and it's constantly crashes on iPhone. Rarely when the app opens, after some time it's closes also. Running on the macOS with "go run ." command works as it should.

    The code:

    package main
    
    import (
    	"fmt"
    
    	"fyne.io/fyne/v2/app"
    	"fyne.io/fyne/v2/container"
    	"fyne.io/fyne/v2/widget"
    )
    
    func main() {
    	a := app.New()
    	w := a.NewWindow("Hello")
    
    	var inc int = 0
    	label := widget.NewLabel(fmt.Sprintf("%d", inc))
    
    	w.SetContent(
    		container.NewVBox(
    			widget.NewButton("Tap me!", func() {
    				inc++
    				label.Text = fmt.Sprintf("%d", inc)
    			}),
    			label,
    		),
    	)
    
    	w.ShowAndRun()
    }
    

    I created an empty Xcode project for making a valid bundle id for the app, then packaged the app with this command: fyne package -os ios -appID <com.bundle.id>, then installed the app on my iPhone SE2 through Xcode/Window/Devices and Simulators.

    I didn't find a good way to debug the app, so I checked in the Console.app and it's says: "Snapshot generation request for bundleID: <com.bundle.id> rejected due to the app being denylisted.". I didn't find any help with that message.

    • Notebook: MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports), 2,3 GHz Quad-Core Intel Core i7, 16 GB 3733 MHz LPDDR4X
    • iPhone: SE2, iOS 14.6 (18F72)
    • go: go version go1.16.3 darwin/amd64 (through homebrew)
    • Fyne: fyne cli version v2.0.3
  • File dialog locations

    File dialog locations

    Description:

    Fixes #821

    Checklist:

    • [x] Tests included.
    • [X] Lint and formatter run with no errors.
    • [x] Tests all pass.

    Where applicable:

    • [X] Public APIs match existing style.
    • ~~[ ] Any breaking changes have a deprecation path or have been discussed.~~ (N/A)
  • fyne package -os android needs NDK 16/19c

    fyne package -os android needs NDK 16/19c

    Describe the bug:

    #2922 & #2919 related but both closed. How to build android app now? I have downloaded NDK 16, 19 & 24 in Android Studio. However armv7a-linux-androideabi16-clang still does not exist. armv7a-linux-androideabi19-clang exists.

    To Reproduce:

    Steps to reproduce the behaviour:

    1. fyne package -os android

    Screenshots:

    no compiler for arm was found in the NDK (tried D:\SDK\ndk\24.0.8215888\toolchains\llvm\prebuilt\windows-x86_64\bin\armv7a-linux-androideabi16-clang). Make sure your NDK version is >= r19c. Use sdkmanager --update to update it

    Example code:

    Device (please complete the following information):

    • OS: Windows
    • Version: 10
    • Go version: 1.18
    • Fyne version: 2.1.4
  • Fix Cursor Animation on widget.Entry

    Fix Cursor Animation on widget.Entry

    Description:

    Fixes #1778

    It seems that #1778 appears, because fade animation is running when user is typing. Cursor should be static when user is interacting with the Entry (as normally cursor animation). Implementation in this PR could be improved, but that's the idea basically.

    Checklist:

    • [x] Tests included.
    • [x] Lint and formatter run with no errors.
    • [x] Tests all pass.
  • widget.ScrollContainer scroll speed is slow

    widget.ScrollContainer scroll speed is slow

    I used widget.ScrollContainer. But scroll speed is slow. Is there an option to increase the amount of movement on the screen for a single mouse wheel movement. For example, if you specify 2 as an option, I want the movement on the screen to double.

  • Unable to build/run

    Unable to build/run

    Describe the bug Fails to build/Run with the error

    To Reproduce function demo https://fyne.io/develop/ copy/paste into main.go, and go run/go build

    Screenshots

    # fyne.io/fyne/vendor/github.com/go-gl/glfw/v3.2/glfw
    In file included from ..\..\..\go\src\fyne.io\fyne\vendor\github.com\go-gl\glfw\v3.2\glfw\c_glfw_windows.go:6:
    ..\..\..\go\src\fyne.io\fyne\vendor\github.com\go-gl\glfw\v3.2\glfw/glfw/src/win32_monitor.c: In function ‘createMonitor’:
    ..\..\..\go\src\fyne.io\fyne\vendor\github.com\go-gl\glfw\v3.2\glfw/glfw/src/win32_monitor.c:68:5: warning: implicit declaration of function ‘wcscpy’ [-Wimplicit-function-declaration]
       68 |     wcscpy(monitor->win32.adapterName, adapter->DeviceName);
          |     ^~~~~~
    ..\..\..\go\src\fyne.io\fyne\vendor\github.com\go-gl\glfw\v3.2\glfw/glfw/src/win32_monitor.c: In function ‘_glfwPlatformIsSameMonitor’:
    ..\..\..\go\src\fyne.io\fyne\vendor\github.com\go-gl\glfw\v3.2\glfw/glfw/src/win32_monitor.c:228:9: warning: implicit declaration of function ‘wcslen’ [-Wimplicit-function-declaration]
      228 |     if (wcslen(first->win32.displayName))
          |         ^~~~~~
    ..\..\..\go\src\fyne.io\fyne\vendor\github.com\go-gl\glfw\v3.2\glfw/glfw/src/win32_monitor.c:229:16: warning: implicit declaration of function ‘wcscmp’ [-Wimplicit-function-declaration]
      229 |         return wcscmp(first->win32.displayName, second->win32.displayName) == 0;
          |                ^~~~~~
    # command-line-arguments
    C:\msys\usr\local\go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit status 1   
    /usr/lib/gcc/x86_64-pc-msys/9.1.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lmingwex
    /usr/lib/gcc/x86_64-pc-msys/9.1.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lmingw32
    collect2: error: ld returned 1 exit status
    

    Device (please complete the following information):

    • OS: Windows 10,
    • Version: 1903
    • Go version: go1.12.7 windows/amd64
    • Fyne version: litterally just go get fyne.io/fyne at around 1920 PST -8 time. 10/27/2019
  • Apps built for Android don't run properly

    Apps built for Android don't run properly

    Describe the bug:

    Fyne applications don't work on Android.

    To Reproduce:

    Build and install an APK, and then run the application.

    1. Create a new directory fynetest; cd there
    2. Copy the source code in this ticket to a file called main.go
    3. go mod init ser1.net.fynetest
    4. Find a 382x512px image to use as an icon
    5. Package the application for Android using fyne; fyne package -os android -appID ser1.net.fynetest -name FyneTest -icon 382x512.png
    6. Copy the resulting APK to an Android device (e.g. with ADB, or with some other file sharing)
    7. Install the APK on the Android device
    8. Run the installed application

    Behaviors vary.

    1. Usually, the app comes up as a white screen and never renders any widgets. It stays a white screen.
    2. Very, very rarely the UI will render and work correctly. Out of two dozen times that I've tried, this has happened twice.
    3. Sometimes, if the screen is tapped early after starting, the UI will partially render; widgets will not work, and are overlapping in random ways. It feels like tapping interrupts the layout and what's shown is where it was interrupted. Again, the UI doesn't function in this state.

    Example code:

    This is a minimal Fyne program; however, I've seen this behavior on the two apps I've built and deployed. The application runs fine on the desktop.

    package main
    
    import (
            "fyne.io/fyne/app"
            "fyne.io/fyne/widget"
    )
    
    func main() {
            a := app.New()
            w := a.NewWindow("test")
            defer w.ShowAndRun()
            w.SetContent(
                    widget.NewVBox(
                            widget.NewLabel("Hello Fyne!"),
                            widget.NewButton("Quit", func() { a.Quit() }),
                    ),
            )
    }
    

    Device (please complete the following information):

    • OS: Android
    • Version: 10
    • Go version: go1.13.7
    • Fyne version: development branch, 97a6e6c0ff8e
  • Fix Select appearance

    Fix Select appearance

    Description:

    Fix Select widget appearance to be similar to SelectEntry.

    Checklist:

    • [ ] Tests included.
    • [x] Lint and formatter run with no errors.
    • [x] Tests all pass.
  • Implement kayboard navigation in widget.Tree

    Implement kayboard navigation in widget.Tree

    Description:

    This implements the Focusable interface for Tree Nodes. Added keyboard navigation:

    • Navigate between tree nodes using tab and shift + tab.
    • Select a tree node by pressing space.
    • Open a branch by pressing right and close using left.

    For https://github.com/fyne-io/fyne/issues/1515

    Opening as draft for now until I have implemented tests.

    Checklist:

    • [ ] Tests included.
    • [x] Lint and formatter run with no errors.
    • [x] Tests all pass.
  • Implement keyboard navigation in file dialog

    Implement keyboard navigation in file dialog

    Description:

    This greatly improves the usability of the file dialog by making sure that it can be navigated with a keyboard.

    • Hover previous and next items using tab and shift+tab.
    • Select hovered item by pressing space.

    I also noticed that the background was refreshed twice, so I removed that. Should avoid a redraw, I think :)

    For #1515

    Checklist:

    • [x] Tests included.
    • [x] Lint and formatter run with no errors.
    • [x] Tests all pass.
  • Hyperlink enhancement: underline and tappable area shouldn't be wider than the text label

    Hyperlink enhancement: underline and tappable area shouldn't be wider than the text label

    Checklist

    • [X] I have searched the issue tracker for open issues that relate to the same feature, before opening a new one.
    • [X] This issue only relates to a single feature. I will open new issues for any other features.

    Is your feature request related to a problem?

    If a hyperlink widget is placed in a layout that makes it wider than needed to fully display the text label, the full area of the hyperlink widget is tappable and the underline extends past the end of the text, the full width of the widget.

    Is it possible to construct a solution with the existing API?

    Yes, but it's really hacky:

    • If you want to support textwrap truncate, create a custom widget that extends (or wraps) a widget.Hyperlink and overrides minSize to return something sensible to keep it from shrinking to zero
    • place the widget.Hyperlink or your custom hyperlink wrapper above in a HBox container with a spacer, and use this container where you'd use widget.Hyperlink otherwise. The layout will shrink the hyperlink to only show the text and take up the rest of the space to the right with the spacer

    Describe the solution you'd like to see.

    Ideally, the desktop pointer should only change when hovering over the text label, tapping/clicking the widget outside the width of the text label should do nothing, and the visual underline should never extend past the width of the text.

  • internal/cache: use expiringCache over expiringCacheNoLock in svgInfo

    internal/cache: use expiringCache over expiringCacheNoLock in svgInfo

    Description:

    As of #2659, on darwin/arm64, most of the draw operations are run on the main thread. This mitigates many data races to appear in the official demo. However, after #2812, a new type of data race can appear at boot time:

    $ cd cmd/fyne_demo && go build -race
    $ ./fyne_demo
    2022/12/31 12:26:47 Lifecycle: Started
    ==================
    WARNING: DATA RACE
    Write at 0x00c0004dc960 by goroutine 14:
      fyne.io/fyne/v2/internal/cache.(*expiringCacheNoLock).setAlive()
          /Users/changkun/dev/changkun.de/fyne/internal/cache/base.go:246 +0x94
      fyne.io/fyne/v2/internal/cache.GetSvg()
          /Users/changkun/dev/changkun.de/fyne/internal/cache/svg.go:22 +0xd4
      fyne.io/fyne/v2/internal/painter.paintImage()
          /Users/changkun/dev/changkun.de/fyne/internal/painter/image.go:107 +0x3e0
      fyne.io/fyne/v2/internal/painter.PaintImage()
          /Users/changkun/dev/changkun.de/fyne/internal/painter/image.go:54 +0xfc
      fyne.io/fyne/v2/internal/driver/glfw.itemForMenuItem()
          /Users/changkun/dev/changkun.de/fyne/internal/driver/glfw/driver_desktop.go:89 +0x340
      fyne.io/fyne/v2/internal/driver/glfw.(*gLDriver).refreshSystrayMenu()
          /Users/changkun/dev/changkun.de/fyne/internal/driver/glfw/driver_desktop.go:117 +0x94
      fyne.io/fyne/v2/internal/driver/glfw.(*gLDriver).refreshSystray()
          /Users/changkun/dev/changkun.de/fyne/internal/driver/glfw/driver_desktop.go:105 +0x80
      fyne.io/fyne/v2/internal/driver/glfw.(*gLDriver).SetSystemTrayMenu.func1.1()
          /Users/changkun/dev/changkun.de/fyne/internal/driver/glfw/driver_desktop.go:46 +0xe8
      fyne.io/systray.Register.func2()
          /Users/changkun/dev/changkun.de/fyne/vendor/fyne.io/systray/systray.go:102 +0x44
    
    Previous read at 0x00c0004dc960 by main goroutine:
      fyne.io/fyne/v2/internal/cache.(*expiringCacheNoLock).isExpired()
          /Users/changkun/dev/changkun.de/fyne/internal/cache/base.go:240 +0xac
      fyne.io/fyne/v2/internal/cache.destroyExpiredSvgs.func1()
          /Users/changkun/dev/changkun.de/fyne/internal/cache/svg.go:48 +0xa0
      sync.(*Map).Range()
          /Users/changkun/goes/go/src/sync/map.go:354 +0x1b4
      fyne.io/fyne/v2/internal/cache.destroyExpiredSvgs()
          /Users/changkun/dev/changkun.de/fyne/internal/cache/svg.go:46 +0xb4
      fyne.io/fyne/v2/internal/cache.CleanCanvases()
          /Users/changkun/dev/changkun.de/fyne/internal/cache/base.go:109 +0x124
      fyne.io/fyne/v2/internal/driver/glfw.(*gLDriver).drawSingleFrame()
          /Users/changkun/dev/changkun.de/fyne/internal/driver/glfw/loop.go:105 +0x64
      fyne.io/fyne/v2/internal/driver/glfw.(*gLDriver).runGL()
          /Users/changkun/dev/changkun.de/fyne/internal/driver/glfw/loop.go:176 +0x624
      fyne.io/fyne/v2/internal/driver/glfw.(*gLDriver).Run()
          /Users/changkun/dev/changkun.de/fyne/internal/driver/glfw/driver.go:168 +0xb8
      fyne.io/fyne/v2/internal/driver/glfw.(*window).ShowAndRun()
          /Users/changkun/dev/changkun.de/fyne/internal/driver/glfw/window.go:230 +0x44
      main.main()
          /Users/changkun/dev/changkun.de/fyne/cmd/fyne_demo/main.go:67 +0x5d8
    
    Goroutine 14 (running) created at:
      fyne.io/systray.Register()
          /Users/changkun/dev/changkun.de/fyne/vendor/fyne.io/systray/systray.go:100 +0xe0
      fyne.io/systray.RunWithExternalLoop()
          /Users/changkun/dev/changkun.de/fyne/vendor/fyne.io/systray/systray.go:81 +0x30
      fyne.io/fyne/v2/internal/driver/glfw.(*gLDriver).SetSystemTrayMenu.func1()
          /Users/changkun/dev/changkun.de/fyne/internal/driver/glfw/driver_desktop.go:36 +0xd8
      sync.(*Once).doSlow()
          /Users/changkun/goes/go/src/sync/once.go:74 +0xb0
      sync.(*Once).Do()
          /Users/changkun/goes/go/src/sync/once.go:65 +0x40
      fyne.io/fyne/v2/internal/driver/glfw.(*gLDriver).SetSystemTrayMenu()
          /Users/changkun/dev/changkun.de/fyne/internal/driver/glfw/driver_desktop.go:35 +0x58
      fyne.io/fyne/v2/app.(*fyneApp).SetSystemTrayMenu()
          /Users/changkun/dev/changkun.de/fyne/app/app_desktop_darwin.go:30 +0x68
      main.makeTray()
          /Users/changkun/dev/changkun.de/fyne/cmd/fyne_demo/main.go:186 +0x340
      main.main()
          /Users/changkun/dev/changkun.de/fyne/cmd/fyne_demo/main.go:26 +0x80
    ==================
    2022/12/31 12:26:48 Lifecycle: Entered Foreground
    2022/12/31 12:26:49 Lifecycle: Exited Foreground
    2022/12/31 12:26:49 Lifecycle: Stopped
    Found 1 data race(s)
    

    This is because systray is running on a separate goroutine, and therefore the SVG caches are accessed from multiple goroutines.

    Instead of using expiringCacheNoLock, switch to expiringCache to eliminate this type of data race.

    Updates #2509

    Checklist:

    • [ ] Tests included.
    • [x] Lint and formatter run with no errors.
    • [x] Tests all pass.
  • Grey theme

    Grey theme

    Checklist

    • [X] I have searched the issue tracker for open issues that relate to the same feature, before opening a new one.
    • [X] This issue only relates to a single feature. I will open new issues for any other features.

    Is your feature request related to a problem?

    After the version is updated, a. Settings(). SetTheme (theme. DarkTheme()) is not as beautiful as the original one, and the original effect is more gray. I hope the author can roll back and add theme. GreyTheme() as the original theme. I think it is very beautiful. I love fyne very much. Pay two contrast pictures of the former and the current DarkTheme

    before image

    now image

    It's too dark,Hope to get the support of the author

    Is it possible to construct a solution with the existing API?

    No response

    Describe the solution you'd like to see.

    a.Settings().SetTheme(theme.GreyTheme())

  • Add the ability to disable ToolbarActions #2306

    Add the ability to disable ToolbarActions #2306

    Description:

    Issue addressed Add the ability to disable ToolbarActions #2306 The change is inspired from same properties as Button for ToolbarAction. Comments from issue were helpful and followed during code change.

    Fixes #2306

    Checklist:

    • [x] Tests included.
    • [ ] Lint and formatter run with no errors.
    • [x] Tests all pass.
Cross platform rapid GUI framework for golang based on Dear ImGui.
Cross platform rapid GUI framework for golang based on Dear ImGui.

giu Cross platform rapid GUI framework for golang based on Dear ImGui and the great golang binding imgui-go. Any contribution (features, widgets, tuto

Dec 28, 2022
Build cross platform GUI apps with GO and HTML/JS/CSS (powered by Electron)

Thanks to go-astilectron build cross platform GUI apps with GO and HTML/JS/CSS. It is the official GO bindings of astilectron and is powered by Electr

Jan 9, 2023
Build cross platform GUI apps with GO and HTML/JS/CSS (powered by nwjs)
Build cross platform GUI apps with GO and HTML/JS/CSS (powered by nwjs)

gowd Build cross platform GUI apps with GO and HTML/JS/CSS (powered by nwjs) How to use this library: Download and install nwjs Install this library g

Dec 11, 2022
RobotGo, Go Native cross-platform GUI automation @vcaesar

Robotgo Golang Desktop Automation. Control the mouse, keyboard, bitmap, read the screen, Window Handle and global event listener. RobotGo supports Mac

Jan 7, 2023
Cross-platform GUI for go is never this easy and clean.
Cross-platform GUI for go is never this easy and clean.

gimu Strongly suggest NOT to use this project anymore, the auto-generated cgo wrapper of Nuklear has a random crash issue which is hard to fix (becaus

Jul 12, 2022
Cross-Platform GUI Framework for Go

⚠️ I'm currently working on this project as part of my master's thesis at the Berlin University of Applied Sciences and Technology. It is under active

Oct 31, 2022
Kita is a declarative, reactive GUI toolkit for build cross platform apps with web technology with single codebase
Kita is a declarative, reactive GUI toolkit for build cross platform apps with web technology with single codebase

Kita is a declarative, reactive GUI toolkit for build cross platform apps with web technology with single codebase. Inspired by Flutter, React. S

Apr 18, 2022
UIKit - A declarative, reactive GUI toolkit for build cross platform apps with web technology with single codebase
 UIKit - A declarative, reactive GUI toolkit for build cross platform apps with web technology with single codebase

UIKit - A declarative, reactive GUI toolkit for build cross platform apps with web technology with single codebase

Apr 18, 2022
Cross-platform Go/Golang GUI library.

中文 | English GoVCL Cross-platform Golang GUI library, The core binding is liblcl, a common cross-platform GUI library created by Lazarus. GoVCL is a n

Dec 30, 2022
Golang bindings for XCGUI, Windows GUI library, DirectUI design idea.
Golang bindings for XCGUI, Windows GUI library, DirectUI design idea.

XCGUI 项目文档 帮助文档 程序示例 介绍 English | 简体中文 DirectUI设计思想: 在窗口内没有子窗口,界面元素都是逻辑上的区域(无HWND句柄,安全,灵活), 所有UI元素都是自主开发(不受系统限制), 更加灵活的实现各种程序界面,满足不同用户的需求.

Dec 22, 2022
Platform-native GUI library for Go.

ui: platform-native GUI library for Go This is a library that aims to provide simple GUI software development in Go. It is based on my libui, a simple

Jan 9, 2023
An experimental Go cross platform UI library.

GXUI - A Go cross platform UI library. Notice: Unfortunately due to a shortage of hours in a day, GXUI is no longer maintained. If you're looking for

Jan 6, 2023
Build cross-platform modern desktop apps in Go + HTML5
Build cross-platform modern desktop apps in Go + HTML5

Lorca A very small library to build modern HTML5 desktop apps in Go. It uses Chrome browser as a UI layer. Unlike Electron it doesn't bundle Chrome in

Jan 6, 2023
Tiny cross-platform webview library for C/C++/Golang. Uses WebKit (Gtk/Cocoa) and Edge (Windows)

webview A tiny cross-platform webview library for C/C++/Golang to build modern cross-platform GUIs. Also, there are Rust bindings, Python bindings, Ni

Dec 28, 2022
Cross-platform Go library to place an icon in the host operating system's taskbar.

trayhost Package trayhost is a cross-platform Go library to place an icon in the host operating system's taskbar. Platform Support macOS - Fully imple

Nov 6, 2022
Go cross-platform library for displaying dialogs and input boxes

dlgs dlgs is a cross-platform library for displaying dialogs and input boxes. Installation go get -u github.com/gen2brain/dlgs Documentation Document

Dec 24, 2022
A cross-platform app-development module for Go.
A cross-platform app-development module for Go.

The cross-platform Go module for building apps (pronounced klo-va-seed). Usecases As a lightweight alternative to Electron Write your frontend and nat

Dec 1, 2022
pure go, cross-platform, MIT-licensed ui toolkit for developers
pure go, cross-platform, MIT-licensed ui toolkit for developers

duit - developer ui toolkit WARNING: this library is work in progress. backwards incompatible changes will be made. details duit is a pure go (*), cro

Dec 24, 2022
Tiny cross-platform webview library for C/C++/Golang. Uses WebKit (Gtk/Cocoa) and Edge (Windows)

webview A tiny cross-platform webview library for C/C++/Golang to build modern cross-platform GUIs. Also, there are Rust bindings, Python bindings, Ni

Jan 1, 2023