1. 程式人生 > >Golang Gtk+3教程:開始

Golang Gtk+3教程:開始

GTK+是一個控制元件工具包。每個通過GTK+建立的使用者介面由一些控制元件組成。
控制元件是層級式的,window控制元件是主容器,通過在window中新增按鈕、下拉選單、輸入欄位等其他控制元件構成使用者介面。
如果是複雜的使用者介面,推薦使用GtkBuilder(從XML UI描述檔案建立介面)來代替手動編譯使用者介面。
你還可以使用視覺化的介面編輯器,像Glade

GTK+是事件驅動的。這個工具包監聽像點選按鈕一樣的事件並將其傳送給你的應用。

為了使你初步瞭解如何使用GTK+,我們將建立一個Gtk應用。這個應用會建立一個200*200畫素的空window

程式執行效果:

package main

import (
    "github.com/gotk3/gotk3/glib"
    "github.com/gotk3/gotk3/gtk"
    "log"
    "os"
)

func main() {
    const appId = "com.nayoso.example"
    //每個gtk3程式都需要一步
    app, err := gtk.ApplicationNew(appId, glib.APPLICATION_FLAGS_NONE)
    
    if err != nil {
        log.Fatal("Could not create application.", err)
    }
    
    //為activate事件繫結函式, activate會在程式啟動時觸發,也就是app.Run()時
    app.Connect("activate", func() {
        onActivate(app)
    } )

    app.Run(os.Args)    //執行gtkApplication
}

func onActivate(application *gtk.Application) {
    appWindow, err := gtk.ApplicationWindowNew(application) //建立window控制元件

    if err != nil {
        log.Fatal("Could not create application window.", err)
    }
    //設定視窗屬性
    appWindow.SetTitle("Basic Application.")
    appWindow.SetDefaultSize(400, 400)
    //顯示視窗
    appWindow.Show()
}

gtk.ApplicationNew()接受兩個引數一個是 應用標識,其一般使用你域名的倒序形式。另一個是GApplicationFlags,其為了滿足你對應用的特定需求。通常就像例項程式碼一樣寫glib.APPLICATION_FLAGS_NONE就可以了。

好的,我們已經建立了第一個視窗。但這只是一個孤零零的視窗,什麼都沒有。
接下來我們就來顯示一個按鈕吧,並讓其輸出著名的Hello World :-D。

package main

import (
    "fmt"
    "github.com/gotk3/gotk3/glib"
    "github.com/gotk3/gotk3/gtk"
    "log"
    "os"
)

//這部分是相同的
func main() {
    const appId = "com.nayoso.example"
    app, err := gtk.ApplicationNew(appId, glib.APPLICATION_FLAGS_NONE)

    if err != nil {
        log.Fatal("Could not create application.", err)
    }

    app.Connect("activate", func() {
        onActivate(app)
    } )

    app.Run(os.Args)
}

//
func onActivate(application *gtk.Application) {

    appWindow, err := gtk.ApplicationWindowNew(application)
    if err != nil {
        log.Fatal("Could not create application window.", err)
    }
    appWindow.SetTitle("Basic Application.")
    appWindow.SetDefaultSize(400, 400)

    buttonBox, err := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 2)     //以水平佈局建立一個容器, 第二個引數是其中控制元件的畫素間隔
    if err != nil {
        log.Fatal(err)
    }
    appWindow.Add(buttonBox)    //將佈局新增到window中

    button, err := gtk.ButtonNewWithLabel("Hello World")        //建立一個按鈕
    if err != nil {
        log.Fatal(err)
    }
    buttonBox.Add(button)       //將按鈕新增到box容器中

    button.Connect("clicked", func() {  //讓我們為按鈕點選新增一個函式,每次點選都會在命令列輸出Hello World
        fmt.Println("Hello World")
    })


    appWindow.ShowAll()     //與Show()不同在於,它會輸出Window中的子控制元件。你可以修改,檢視不同的效果
}

程式執行效果: