Golang Gtk+3教程:開始
阿新 • • 發佈:2018-11-02
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中的子控制元件。你可以修改,檢視不同的效果 }
程式執行效果: