布局管理

Tue 23 September 2025

布局管理

GTK3提供了多种布局管理器,如GtkBox、GtkGrid等。

以下是一个使用GtkBox的示例:

package main

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

func main() {
    gtk.Init(nil)

    window, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
    if err != nil {
        log.Fatal("Unable to create window:", err)
    }
    window.SetTitle("Complex Layout")
    window.Connect("destroy", func() {
        gtk.MainQuit()
    })

    box, err := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
    if err != nil {
        log.Fatal("Unable to create box:", err)
    }

    label1, err := gtk.LabelNew("Label 1")
    if err != nil {
        log.Fatal("Unable to create label1:", err)
    }
    box.PackStart(label1, true, true, 0)

    label2, err := gtk.LabelNew("Label 2")
    if err != nil {
        log.Fatal("Unable to create label2:", err)
    }
    box.PackStart(label2, true, true, 0)

    window.Add(box)
    window.ShowAll()
    gtk.Main()
}

事件处理

GTK3的事件处理机制非常灵活。以下是一个按钮点击事件的示例:

package main

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

func main() {
    gtk.Init(nil)

    window, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
    if err != nil {
        log.Fatal("Unable to create window:", err)
    }
    window.SetTitle("Event Handling")
    window.Connect("destroy", func() {
        gtk.MainQuit()
    })

    button, err := gtk.ButtonNewWithLabel("Click Me")
    if err != nil {
        log.Fatal("Unable to create button:", err)
    }
    button.Connect("clicked", func() {
        log.Println("Button clicked!")
    })

    window.Add(button)
    window.ShowAll()
    gtk.Main()
}

并发处理

利用Golang的并发特性,可以在后台进行耗时操作,而不阻塞UI线程。

以下是一个简单的示例:

package main

import (
    "github.com/gotk3/gotk3/gtk"
    "log"
    "sync"
)

func main() {
    gtk.Init(nil)

    window, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
    if err != nil {
        log.Fatal("Unable to create window:", err)
    }
    window.SetTitle("Concurrency")
    window.Connect("destroy", func() {
        gtk.MainQuit()
    })

    button, err := gtk.ButtonNewWithLabel("Start Task")
    if err != nil {
        log.Fatal("Unable to create button:", err)
    }
    button.Connect("clicked", func() {
        var wg sync.WaitGroup
        wg.Add(1)
        go func() {
            defer wg.Done()
            // 模拟耗时操作
            log.Println("Task started")
            // 这里可以执行耗时任务
            log.Println("Task completed")
        }()
        wg.Wait()
    })

    window.Add(button)
    window.ShowAll()
    gtk.Main()
}

资源管理

合理管理资源是提高应用性能的关键。GTK3提供了多种资源管理机制,如引用计数、对象池等。确保在不需要时释放资源,避免内存泄漏。

例子 #go #go-gtk #gotk

Category: 编程go