• Stars
    star
    397
  • Rank 108,561 (Top 3 %)
  • Language
    Go
  • License
    Other
  • Created almost 11 years ago
  • Updated about 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Golang wxWidgets Wrapper

wxGo

Golang wxWidgets Wrapper

Travis CI Build Status AppVeyor Build status

Not actively maintained

Please feel free to folk and make your changes. I'm still available through GitHub Issues for any questions.

Notes

For Golang 1.10.0 and 1.9.4, there is a "Invalid flag" issue which causes the build fails. Please check Here for workaround.

Compilation

Currently wxGo can compile and run on Windows, Linux and Mac OS X on amd64 architecture.

1. Requisites

  • 64-bit Go
  • GCC / MinGW ver > 5 for Linux / Windows
  • > 5GB Memory space

Remarks

32-bit go will run out of memory due to ~5GB memory consumption when compiling and I have no idea on how to decline the memory usage. Any suggestion or discussion will help.

The precompiled wxWidgets is compiled with gcc > 5 ( 6.2.1 on Linux, 5.3.0 on Windows using tdm-gcc). So if you want to use the precompiled wxWidgets, your gcc version has also to be > 5, because GCC changed its ABI since GCC 5 release series.

2. Build & Install

go get github.com/dontpanic92/wxGo/wx

You can add -x option to print each command it executes.

Custom Compilation

This section will introduce how to customize wxGo.

1. Compilation phases

wxGo needs a 2-phase compilation. The first is the SWIG phase, that is using SWIG to generate the wrapper code. And the second is the Go phase, which has been described above.

2. Customize SWIG phase

You can regenerate the wrapper code using SWIG. Compilation dependencies are:

  • python 2 or 3
  • sed
  • make
  • A customized SWIG

We use a customized SWIG to generate the wrapper code. Please clone https://github.com/dontpanic92/SWIG and simply ./configure && make && sudo make install. Then you can modify the source as you want, and run make in the build folder.

3. Customize wxWidgets build

If you want to use other wxWidgets build rather than the precompiled one, what you have to do is quite simple.

  • Compile wxWidgets
  • Run go get -d github.com/dontpanic92/wxGo/wx to let the go-tool just download the source
  • Open wx/setup_OS_ARCH.go, change the CPPFLAGS and LDFLAGS
  • Run go install github.com/dontpanic92/wxGo/wx

Done!

Usage

After importing github.com/dontpanic92/wxGo/wx, the following code will create an empty dialog with a "Hello World" as its caption.

    wx.NewApp()
    f := wx.NewDialog(wx.NullWindow, -1, "Hello World")
    f.ShowModal()
    f.Destroy()

All the wx-Classes' objects can be created using wx.NewCLASS. Now let us add some controls on it :

    wx.NewApp()
    f := wx.NewDialog(wx.NullWindow, -1, "Hello World")

    bSizer := wx.NewBoxSizer(wx.VERTICAL)

    checkBox := wx.NewCheckBox(f, wx.ID_ANY, "Check Me!", wx.DefaultPosition, wx.DefaultSize, 0)
    bSizer.Add(checkBox, 0, wx.ALL|wx.EXPAND, 5)

    textCtrl := wx.NewTextCtrl(f, wx.ID_ANY, "", wx.DefaultPosition, wx.DefaultSize, 0)
    bSizer.Add(textCtrl, 0, wx.ALL|wx.EXPAND, 5)

    f.SetSizer(bSizer)
    f.Layout()
    f.ShowModal()
    f.Destroy()

And then we can bind an event on the checkbox :

func checkboxClicked(e wx.Event) {
    wx.MessageBox("Checkbox clicked!")
}

//....
    wx.Bind(f, wx.EVT_CHECKBOX, checkboxClicked, checkBox.GetId())
//....

Bravo!

Remarks : about the memory management

All wx.NewCLASS functions will allocate memory on C++ side (on heap), thus it will not be tracked by Go's garbage collector. However, in most cases we don't need to worry about it, because wxWidgets will handle it. Some common cases are listed below:

  • √ When a wxWindow (or its subclasses) being deleted , it will automatically delete all of its children.

  • √ When we click the close button of a wxFrame, by default the Destroy will be called and it will be deleted by itself (and also all children).

  • × However when we close a wxDialog, the Destroy won't be called by default and we have to manually destroy it.

  • × If an object isn't in the GUI hierarchy, we have to free the memory by calling DeleteCLASS.

In a word, p := wx.NewCLASS in Go acts the same as p = new wxCLASS() in C++. Where we need a delete p, then we need a wx.DeleteCLASS.

More Info:

Examples

Examples are in the examples folder. Dapeton is a simple notepad, and controls is a dialog that contains several widgets.

ScreenShot

screenshot

License

wxGo is licensed under the wxWindows Library Licence.

More Repositories

1

OpenPAL3

仙三开源版 - The efforts to create an open-source implementation of Chinese Paladin 3
Rust
535
star
2

dotnvim

Neovim ❤ Acrylic
C#
57
star
3

rainfuck

Rainfuck is a brainfuck interpreter and JIT compiler implemented in Rust.
Rust
33
star
4

urender

A rust implementation of the ray tracing renderer described in Ray Tracing from the Ground Up
Rust
23
star
5

AudioPlayer

A simple windows audio player with switchable GUI and CUI.
C++
13
star
6

feca

A web browser prototype.
Rust
12
star
7

monodevelop-windows-build

The missing windows builds for monodevelop.
10
star
8

embedded-netease-music-player

网易云音乐外链播放器 - Embed a netease music player into your web page
HTML
8
star
9

AudioPlayer4

Yet another another Audio Player
C++
6
star
10

LinuxICE

Experimental Linux x64 Kernel Debugger
C
6
star
11

FoOTOo-Strike

C
4
star
12

PSOBBCheater

PSOBB外挂程序
C++
2
star
13

Demo-of-Fraunhofer-Diffraction-by-Two-Slits

夫琅和费双缝衍射演示程序
C++
2
star
14

radiance

See https://github.com/dontpanic92/OpenPAL3
Rust
2
star
15

dds-rs

Fork of https://gitlab.com/mechaxl/dds-rs
Rust
1
star
16

Pal5QAssistant

仙剑奇侠传五前传 自动连携技+摄像机漫游
C++
1
star
17

radiance-assets

Embedded assets for the radiance engine
Rust
1
star
18

nodebb-plugin-ns-points-techo

JavaScript
1
star
19

shibaojie

1
star
20

tuesday

JavaScript
1
star
21

ltp-windows-prebuilt

LTP Windows 版本预编译项目
1
star
22

ctf-writeups

dontpan1c 的 CTF 笔记
HTML
1
star
23

learningsicp-bot

Python
1
star
24

vitagl-sys

Rust bindings to vitaGL
Rust
1
star
25

digimon

SRResNet/SRGAN in practice - make my Digimons clearer
Python
1
star
26

AudioPlayer3

Yet another Audio Player
C
1
star