go-gui-控制項和信號

来源:https://www.cnblogs.com/ygjzs/archive/2019/11/27/11946164.html
-Advertisement-
Play Games

go gui 控制項和信號 控制項 控制項簡介 控制項是對數據和方法的封裝。控制項有自己的屬性和方法。屬性是指控制項的特征。方法是指控制項的一些簡單而可見的功能。如按鈕就是一個控制項,這個按鈕是方形的,裡面有張圖片,這是我們能看到外觀屬性,同時,這個按鈕具備被人按下的功能。 GTK中控制項主要分為兩類:容器控制項,非容 ...


go-gui-控制項和信號

控制項

控制項簡介

控制項是對數據和方法的封裝。控制項有自己的屬性和方法。屬性是指控制項的特征。方法是指控制項的一些簡單而可見的功能。如按鈕就是一個控制項,這個按鈕是方形的,裡面有張圖片,這是我們能看到外觀屬性,同時,這個按鈕具備被人按下的功能。

GTK中控制項主要分為兩類:容器控制項,非容器控制項。

容器控制項:它可以容納別的控制項,我們可以理解為盒子,盒子拿來裝東西。容器控制項又分為兩類,一類只能容納一個控制項,如視窗,按鈕;另一類能容納多個控制項,如佈局控制項。
非容器控制項:它不可以容納別的控制項,如標簽、行編輯。

package main

import (
    "os"

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

func main() {
    gtk.Init(&os.Args) //環境初始化

    //--------------------------------------------------------
    // 主視窗
    //--------------------------------------------------------
    window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL) //創建視窗
    window.SetPosition(gtk.WIN_POS_CENTER)       //設置視窗居中顯示
    window.SetTitle("GTK Go!")                   //設置標題
    window.SetSizeRequest(300, 200)              //設置視窗的寬度和高度

    //--------------------------------------------------------
    // GtkFixed
    //--------------------------------------------------------
    layout := gtk.NewFixed() //創建固定佈局

    //--------------------------------------------------------
    // GtkButton
    //--------------------------------------------------------
    b1 := gtk.NewButton() //新建按鈕
    b1.SetLabel("^_@")    //設置內容
    //b1.SetSizeRequest(100, 50) //設置按鈕大小

    b2 := gtk.NewButtonWithLabel("@_~") //新建按鈕,同時設置內容
    b2.SetSizeRequest(100, 50)          //設置按鈕大小

    //--------------------------------------------------------
    // 添加佈局、添加容器
    //--------------------------------------------------------
    window.Add(layout) //把佈局添加到主視窗中

    layout.Put(b1, 0, 0)    //設置按鈕在容器的位置
    layout.Move(b1, 50, 50) //移動按鈕的位置,必須先put,再用move

    layout.Put(b2, 50, 100)

    window.ShowAll() //顯示所有的控制項

    gtk.Main() //主事件迴圈,等待用戶操作
}

//func (v *Fixed) Put(w IWidget, x, y int)
//功能:固定佈局容器添加控制項
//參數:
//    widget:要添加的控制項
//    x, y:控制項擺放位置的起點坐標

信號

GTK採用了信號與回調函數來處理視窗外部傳來的事件、消息或信號。當信號發生時,程式自動調用為信號連接(註冊)的回調函數。

學習圖形界面編程,我們會經常接觸到“信號”這個名詞。GTK中的“信號”實際上是一種軟體中斷。“中斷”在我們生活中經常遇到,譬如,我正在房間里打游戲,突然送快遞的來了,把正在玩游戲的我給“中斷”了,我去簽收快遞( 處理中斷 ),處理完成後,再繼續玩我的游戲。GTK中的“信號”就是屬於這麼一種“中斷”,當用戶按下按鈕的時候,就產生一個“中斷”,相當於產生一個信號,接著就會處理這麼一個“中斷任務”(程式里體驗為調用一個函數)。

“信號”在GTK中可以認為一種中斷的標誌,如按下按鈕的標誌為”pressed”,釋放按鈕的標誌為”released”,這些標誌就相當於 go 語言的關鍵字一樣,我們使用的時候必須完全按照它的名字來寫。需要註意的是,每個控制項的信號標誌不一定都一樣,如按鈕(GtkButton)里有”pressed”信號,視窗(GtkWindow)里就沒這個信號,每個控制項具體有哪個信號,應該查看幫助文檔來確定。
信號標識 觸發條件

“clicked” 按下按鈕時觸發
“pressed” 按下按鈕時觸發
“released” 釋放按鈕時觸發

package main

import (
    "fmt"
    "os"

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

//按鈕b1信號處理的回調函數
func HandleButton(ctx *glib.CallbackContext) {
    arg := ctx.Data()   //獲取用戶傳遞的參數,是空介面類型
    p, ok := arg.(*int) //類型斷言
    if ok {             //如果ok為true,說明類型斷言正確
        fmt.Println("*p = ", *p) //用戶傳遞傳遞的參數為&tmp,是一個變數的地址
        *p = 250                 //操作指針所指向的記憶體
    }

    fmt.Println("按鈕b1被按下")

    //gtk.MainQuit() //關閉gtk程式
}

func main() {
    gtk.Init(&os.Args) //環境初始化

    //--------------------------------------------------------
    // 主視窗
    //--------------------------------------------------------
    window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL) //創建視窗
    window.SetPosition(gtk.WIN_POS_CENTER)       //設置視窗居中顯示
    window.SetTitle("GTK Go!")                   //設置標題
    window.SetSizeRequest(300, 200)              //設置視窗的寬度和高度

    //--------------------------------------------------------
    // GtkFixed
    //--------------------------------------------------------
    layout := gtk.NewFixed() //創建固定佈局

    //--------------------------------------------------------
    // GtkButton
    //--------------------------------------------------------
    b1 := gtk.NewButton() //新建按鈕
    b1.SetLabel("^_@")    //設置內容
    //b1.SetSizeRequest(100, 50) //設置按鈕大小

    b2 := gtk.NewButtonWithLabel("@_~") //新建按鈕,同時設置內容
    b2.SetSizeRequest(100, 50)          //設置按鈕大小

    //--------------------------------------------------------
    // 添加佈局、添加容器
    //--------------------------------------------------------
    window.Add(layout) //把佈局添加到主視窗中

    layout.Put(b1, 0, 0)    //設置按鈕在容器的位置
    layout.Move(b1, 50, 50) //移動按鈕的位置,必須先put,再用move

    layout.Put(b2, 50, 100)

    //--------------------------------------------------------
    // 信號處理
    //--------------------------------------------------------
    //按鈕按下自動觸發"pressed",自動調用HandleButton, 同時將 &tmp 傳遞給HandleButton
    tmp := 10
    b1.Connect("pressed", HandleButton, &tmp)

    //回調函數為匿名函數,推薦寫法
    //按鈕按下自動觸發"pressed",自動調用匿名函數,
    b2.Connect("pressed", func() {

        fmt.Println("b2被按下")
        fmt.Println("tmp = ", tmp)

    }) //註意:}和)在同一行

    window.ShowAll() //顯示所有的控制項

    gtk.Main() //主事件迴圈,等待用戶操作
}

//func (v *Widget) Connect(s string, f interface{}, datas ...interface{}) int
//功能:信號註冊
//參數:
//    v: 信號發出者,可以認為我們操作的控制項,如按下按鈕,這個就為按鈕指針
//    s:信號標誌,如"pressed"
//    f:回調函數的名稱,
//    datas:給回調函數傳的參數,儘管是可變參數,但是只能傳遞一個參數,可變參數的目的為了讓用戶多個選擇(可以傳參,或者不傳)
//返回值:
//    註冊函數的標誌

glade的簡單使用

package main

import (
    "fmt"
    "os"

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

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

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

    // 獲取視窗控制項指針,註意"window1"要和glade里的標誌名稱匹配
    window := gtk.WindowFromObject(builder.GetObject("window1"))
    b1 := gtk.ButtonFromObject(builder.GetObject("123456"))        //獲取按鈕1
    b2 := gtk.ButtonFromObject(builder.GetObject("togglebutton1")) //獲取按鈕2

    //信號處理
    b1.Connect("clicked", func() {
        //獲取按鈕內容
        fmt.Println("button txt = ", b1.GetLabel())
    })

    b2.Connect("clicked", func() {
        //獲取按鈕內容
        fmt.Println("button txt = ", b2.GetLabel())
        gtk.MainQuit() //關閉視窗
    })

    //按視窗關閉按鈕,自動觸發"destroy"信號
    window.Connect("destroy", gtk.MainQuit)

    window.ShowAll()

    gtk.Main()
}

//可以簡單分為兩步:

//1)讀取glade文件

//// 創建GtkBuilder對象,GtkBuilder在<gtk/gtk.h>聲明

//GtkBuilder *builder = gtk_builder_new();

//// 讀取test.glade文件的信息,保存在builder指針變數里

//gtk_builder_add_from_file(builder, "./test.glade", NULL);

//2)獲取glade文件里的控制項

//// 獲取視窗控制項指針,註意"window1" 要和glade里的標誌名稱匹配

//GtkWidget *window = GTK_WIDGET(gtk_builder_get_object (builder, "window1"));

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 尋找文本所在的標簽waitClickCompanyName = driver.find_elements_by_xpath('//div[@id="nsrzt"]//li') for i in waitClickCompanyName: #找出標簽中的文本內容 name = i.get_attr ...
  • 一、FTP工作流程 1.客戶端鏈接遠程主機上的FTP伺服器 2.客戶端輸入用戶名和密碼(或者“anonymous”和電子郵件地址) 3.客戶端和伺服器進行各種文件傳輸和信息查詢操作 4.客戶端從遠程FTP伺服器退出,結束傳 二、FTP文件表示 1.分三段表示FTP伺服器上的文件 2.HOST:主機地 ...
  • 這段代碼是參照慕課網的視頻教程,主要是f.Seek(0, os.SEEK_END)移動到末尾,但是裡面有個小問題,當打開的文件被重新清空內容的清空下,就再也不能到讀取數據了,比如在開啟讀取後 echo ''>1.log 這樣就再也讀不到了,tail包是解決了這個問題的 使用tail包測試時,有re- ...
  • 場景 為了能快速搭建起一個ElementUI項目,我們可以使用element-starter這個模板進行快速搭建。 element-starter的Github https://github.com/ElementUI/element-starter 按照其官方要求node>=6 註: 博客: ht ...
  • 最近在回顧電腦網路的知識,以前上課沒有認真學,只記得幾個高大上的術語,所以趁著這次回顧,把學到的知識用博客的形式記錄下來,一來加深自己的印象,二來希望讓你對這些基礎知識有一個更深入的瞭解。當然,我會儘量把 UDP 協議講清楚,講明白,讓你“不虛此行”。 UDP( User Datagram Pro ...
  • 背景 在項目的部署過程中,一般是打成 war 或者 jar 包,這樣一般存在兩種問題: 1. 即使是配置文件修改,也還需要整個項目重新打包和部署。 2. 整個項目只有一套環境,不能切換。 針對上面的問題,可以使用外部化配置來解決。 需求 由於伺服器上的應用伺服器存放路徑未知,只知應用伺服器的目錄結構 ...
  • 稀疏數組 基本介紹 當一個數組中大部分元素為0,或者為同一個值的數組時,可以使用稀疏數組來保存該數組。 如下圖所示: 稀疏數組的處理方法: 1. 記錄數組一共有幾行幾列,有多少個不同的值; 2. 把具有不同值的元素的行列及值記錄在一個小規模的數組中,從而縮小程式的規模; 稀疏數組轉換思路 二維數組轉 ...
  • 有點笨,參考了好幾篇大佬們寫的文章才整理出來的筆記.... 字面意思上解釋,線程池就是裝有線程的池,我們可以把要執行的多線程交給線程池來處理,和連接池的概念一樣,通過維護一定數量的線程池來達到多個線程的復用。 好處 多線程產生的問題 一般我們使用到多線程的編程的時候,需要通過 創建並開啟線程,我們可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...