dontpanic92 / wxGo

Golang wxWidgets Wrapper
Other
404 stars 51 forks source link
go gui wxwidgets

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

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:

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.

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:

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.