Go版GTK:定時器

定時器在應用編程裏用得很廣,我們手機裏的鬧鐘,幻燈片播放圖片等應用都用到定時器。定時器,每隔一段時間幹一件事(程序裏表現爲調用一個函數),像鬧鐘,每隔一天響一次。

1 核心API說明

import "github.com/mattn/go-gtk/glib"

func TimeoutAdd(interval uint, f interface{}, datas ...interface{}) (id int)
功能:創建定時器
參數:
    interval:設置的時間間隔,以毫秒爲單位(1000爲1秒 )
    f:回調函數的名字,回調函數的返回類型爲bool,當回調函數返回值爲false時,定時器執行一次後便會停止工作,不再循環執行。所以,要想定時器連續工作,循環執行所指定的回調函數,應該返回true。
    datas:給回調函數傳的參數
返回值:定時器id號

func TimeoutRemove(id int)
功能:移除定時器
參數:定時器id號

2 示例程序

glade設計如下:
這裏寫圖片描述

示例代碼:

package main

import (
    "os"
    "strconv"

    "github.com/mattn/go-gtk/glib"
    "github.com/mattn/go-gtk/gtk"
)

func main() {
    gtk.Init(&os.Args)

    builder := gtk.NewBuilder()       //新建builder
    builder.AddFromFile("test.glade") //讀取glade文件

    // 獲取相應控件
    window := gtk.WindowFromObject(builder.GetObject("window1"))
    label := gtk.LabelFromObject(builder.GetObject("label"))
    buttonStart := gtk.ButtonFromObject(builder.GetObject("buttonStart"))
    buttonStop := gtk.ButtonFromObject(builder.GetObject("buttonStop"))

    label.ModifyFontSize(50)       //設置label字體大小
    buttonStop.SetSensitive(false) //停止按鈕不能按

    var id int      //定時器id
    var num int = 1 //累加標記

    //信號處理
    //啓動按鈕
    buttonStart.Connect("clicked", func() {
        //啓動定時器, 500毫秒爲時間間隔,回調函數爲匿名函數
        id = glib.TimeoutAdd(500, func() bool {
            num++
            label.SetText(strconv.Itoa(num)) //給標籤設置內容
            return true                      //只要定時器沒有停止,時間到自動調用回調函數
        })

        buttonStart.SetSensitive(false) //啓動按鈕變灰,不能按
        buttonStop.SetSensitive(true)   //定時器啓動後,停止按鈕可以按
    })

    //停止按鈕
    buttonStop.Connect("clicked", func() {
        //停止定時器
        glib.TimeoutRemove(id)

        buttonStart.SetSensitive(true)
        buttonStop.SetSensitive(false)
    })

    window.Connect("destroy", gtk.MainQuit) //關閉窗口

    window.ShowAll()

    gtk.Main()
}

程序運行效果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章