Un rápido marco de GUI multiplataforma para GO basado en Dear Imgui y The Great Go Binding IMGui-Go.
¡Se agradece cualquier contribución (características, widgets, tutoriales, documentos, etc.)!
(Esta biblioteca está disponible bajo una licencia gratuita y permisiva, pero necesita apoyo financiero para mantener sus mejoras continuas. Además del mantenimiento y la estabilidad, hay muchas características deseables aún por agregar. Si está utilizando GIU, considere comunicarse).
Negocios: Apoyo el desarrollo y mantenimiento continuo a través del soporte técnico facturado, el mantenimiento, el patrocinio de contratos:
Correo electrónico: [email protected]
Individuos: apoya el desarrollo y el mantenimiento continuos aquí.
Para la documentación, consulte nuestro wiki, ejemplos, godoc, o simplemente eche un vistazo a los comentarios en el código.
GIU se basa en GLFW V3.3, por lo que idealmente GIU podría admitir todas las plataformas que GLFW V3.3 admite.
En comparación con otras ataduras de Dear Imgui Golang, GIU tiene las siguientes características:
package main
import (
"fmt"
g "github.com/AllenDang/giu"
)
func onClickMe () {
fmt . Println ( "Hello world!" )
}
func onImSoCute () {
fmt . Println ( "Im sooooooo cute!!" )
}
func loop () {
g . SingleWindow (). Layout (
g . Label ( "Hello world from giu" ),
g . Row (
g . Button ( "Click Me" ). OnClick ( onClickMe ),
g . Button ( "I'm so cute" ). OnClick ( onImSoCute ),
),
)
}
func main () {
wnd := g . NewMasterWindow ( "Hello world" , 400 , 200 , g . MasterWindowFlagsNotResizable )
wnd . Run ( loop )
}
Aquí está el resultado:
El sistema de GUI de modo inmediato significa que el control de la interfaz de usuario no conserva su estado y valor. Por ejemplo, llamar giu.InputText(&str)
mostrará un cuadro de texto de entrada en la pantalla, y el valor ingresado por el usuario se almacenará en &str
. El cuadro de texto de entrada no sabe nada al respecto.
Y el método loop
en el ejemplo de Hello World está a cargo de dibujar todos los widgets en función de los parámetros que se pasan en ellos. Este método se invocará 30 veces por segundo para reflejar estados interactivos (como hacer clic, flotar, cambiar de valor, etc.). Será el lugar donde defina la estructura de la interfaz de usuario.
Por defecto, cualquier widget colocado dentro del Layout
de un contenedor se colocará verticalmente.
Para crear una fila de widgets (es decir, colocar widgets uno por uno horizontalmente), use el método Row()
. Por ejemplo, giu.Row(Label(...), Button(...))
creará una etiqueta junto a un botón.
Para crear una columna de widgets (es decir, lugar widgets uno por uno verticalmente) dentro de una fila, use el método Column()
.
Cualquier widget que tenga un método Size()
puede establecer su tamaño explícitamente. Tenga en cuenta que puede pasar un valor negativo al Size()
, que llenará el valor de ancho/altura restante. Por ejemplo, InputText(...).Size(giu.Auto)
creará un cuadro de texto de entrada con el ancho más largo que su contenedor le queda.
Un MasterWindow
significa la ventana nativa de la plataforma implementada por el sistema operativo. Todas las subventucas y widgets se colocarán dentro de él.
Una Window
es un contenedor con una barra de título y se puede colapsar. SingleWindow
es un tipo especial de ventana que ocupará todo el espacio disponible de MasterWindow
.
Un Child
es como un panel en otros marcos de GUI: puede tener un color de fondo y un borde.
Verifique examples/widgets
para ver todo tipo de widgets.
El backend de GIU depende de OpenGL 3.3, asegúrese de que su entorno lo admita (hasta donde yo sé, algunas máquinas virtuales como VirtualBox no lo admiten).
xcode-select --install
go get github.com/AllenDang/giu
Primero debe instalar las dependencias requeridas:
sudo apt install libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev libglx-dev libgl1-mesa-dev libxxf86vm-dev
En distribuciones basadas en el sombrero rojo:
sudo dnf install libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel libXi-devel libGL-devel libXxf86vm-devel
También es posible que deba instalar el compilador C/C ++ (como G ++) si aún no está instalado. Sigue las indicaciones del compilador GO.
Entonces, una simple go build
Funcionará.
La compilación cruzada es un poco más complicada. Digamos que quieres construir para ARM64. Esto es lo que necesitarías hacer:
sudo dpkg --add-architecture arm64
sudo apt update
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
libx11-dev:arm64 libxcursor-dev:arm64 libxrandr-dev:arm64 libxinerama-dev:arm64 libxi-dev:arm64 libglx-dev:arm64 libgl1-mesa-dev:arm64 libxxf86vm-dev:arm64
GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ HOST=aarch64-linux-gnu go build -v
go build -ldflags " -s -w " .
go build -ldflags " -s -w -H=windowsgui -extldflags=-static " .
En Mac:
brew install mingw-w64
En Linux:
sudo dnf install mingw64-gcc mingw64-gcc-c++ mingw64-winpthreads-static
cat > YourExeName.rc << EOL
id ICON "./res/app_win.ico"
GLFW_ICON ICON "./res/app_win.ico"
EOL
x86_64-w64-mingw32-windres YourExeName.rc -O coff -o YourExeName.syso
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ HOST=x86_64-w64-mingw32 go build -ldflags " -s -w -H=windowsgui -extldflags=-static " -p 4 -v -o YourExeName.exe
rm YourExeName.syso
rm YourExeName.rc
¡Todo tipo de solicitudes de extracción (documento, demostración, capturas de pantalla, código, etc.) son más que bienvenidos!