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 😄。
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.Destroy() //摧毀窗口
})
appWindow.ShowAll() //與Show()不同在於,它會輸出Window中的子控件。你可以修改,查看不同的效果
}
程序運行效果:


本作品采用知識共享署名-非商業性使用-禁止演繹 4.0 國際許可協議進行許可。轉載請注明出處!
