1. 程式人生 > >astilectron之Go語言golang的圖形介面

astilectron之Go語言golang的圖形介面

astilectron 是一個Electron應用程式,通過TCP套接字提供API,允許執行Electron的方法以及捕獲Electron的事件。

架構

+-----------------------+    TCP    +-------------+    IPC   +---------------------+
+ Client App (any Lang) |<--------->+ Astilectron +<-------->+ win1: (HTML/JS/CSS) +
+-----------------------+           +-------------+     |    +---------------------++
             |                             |            +---->+ win2: (HTML/JS/CSS) +
             |         +----------+        |               |  +---------------------++
             +---------+ Electron +--------+               +-->+ win3: (HTML/JS/CSS) +
                       +----------+                            +---------------------+

語言繫結

語言繫結起著重要作用,astilectron因為它們允許與TCP套接字進行通訊,因此與任何語言的API進行互動。

我想為一種新的語言開發語言繫結

大!:)

以下是您需要了解的幾件事情:

  • astilectron通常包括下載和解壓縮的語言繫結的責任astilectronelectron
  • TCP addr astilectron通過命令列引數傳送,因此您的命令列呼叫時astilectron應該看起來像<path to electron executable> <path to astilectron directory>/main.js <tcp addr>

GO的語言繫結

go-astilectron使用GO和HTML / JS / CSS構建跨平臺GUI應用程式。這是官方GO繫結astilectron,由供電電子

現實生活中的例子

以下是一系列令人敬畏的專案go-astilectron(如果您正在使用go-astilectron並希望將您的專案列在此處,請提交PR):

  • GroupMatcher計劃將人員分配給團體,同時儘可能地履行所有願望

快速開始

警告:以下程式碼無法處理可讀性的錯誤。但你應該!

進口 go-astilectron

要匯入go-astilectron執行:

$ go get -u github.com/asticode/go-astilectron

開始 go-astilectron

//初始化astilectron 
var  a _ = astilectron。新的(astilectron。選項 {
     AppName <您的應用程式名稱>  AppIconDefaultPath <您的.png圖示>  AppIconDarwinPath <your .icns圖示>  BaseDirectoryPath <您希望供應商安裝依賴關係> 
})
推遲一個 關閉()

//開始astilectron 
a。開始()

為了使一切正常工作,我們需要獲取2個依賴關係:astilectronElectron.Start()通過下載源並正確設定來處理它。

如果要嵌入二進位制來源,以保持唯一的二進位制就可以使用NewDisembedderProvisioner功能得到適當的置備並將其連線到go-astilectron.SetProvisioner(p Provisioner)看看這個例子,看看如何使用go-bindata

當您嘗試新增自己的應用程式圖示時,請注意,您需要2個圖示:一個與MacOSX(.icns)相容的圖示,另一個與其他圖示相容(例如.png)。

如果沒有提供BaseDirectoryPath,它將預設為可執行檔案的目錄路徑。

大多數方法是同步器,這意味著執行它們時go-astilectron將阻塞,直到它接收到特定的電子事件或者直到整個上下文被取消為止。這種情況.Start()將阻止,直到它收到app.event.ready astilectron事件或直到整個上下文被取消為止。

建立一個視窗

//建立一個新視窗
var  w _ = a。NewWindow http://127.0.0.1:4000 ,與astilectron。 WindowOptions {
    中心:astilectron PtrBool),
    身高:astilectron PtrInt 600),
    寬度:astilectron PtrInt 600
})
W上。建立()

建立視窗時,您需要指定一個URL以及位置,大小等選項。

這是非常簡單的,除了astilectron.Ptr*方法,所以讓我解釋一下:GO不會在json編碼時執行可選欄位,除非你使用指標,而Electron確實處理可選欄位。因此,我添加了幫助方法將int,bool和string轉換為指標,並將結果中使用的指標轉換為Electron。

新增聽眾

//在Astilectron上新增一個監聽器 
a。(astilectron。 EventNameAppCrash FUNC(E astilectron。事件)(deleteListener布林){
    astilog。錯誤 App已崩潰返回
})

//在視窗 
w上新增一個監聽器(astilectron。 EventNameWindowEventResize FUNC(E astilectron。事件)(deleteListener布林){
    astilog。Info Window resized return 
})

除了你可以新增聽眾到Astilectron以外,沒有什麼可說的。

玩窗戶

//玩窗戶 
w。調整大小 200 200
時間。睡覺(時間第二
W上。最大化()

檢視視窗文件以獲取所有已匯出方法的列表

在GO和您的網路伺服器之間傳送訊息

在您的網路伺服器中,將以下JavaScript新增到您要與之進行互動的任何頁面:

< script >
    //這將等待astilectron名稱空間準備好
文件的addEventListener astilectron就緒函式(){ //這將聽取GO傳送的訊息astilectron函式訊息){ //這將訊息傳送回走astilectron傳送我很好bro         });    })








< / script >

在您的GO應用中新增以下內容:

//聽Web伺服器 
w傳送的訊息(astilectron。 EventNameWindowEventMessage FUNC(E astilectron。事件)(deleteListener布林){
     VAR   訊息解組(M)
    astilog。Infof Received message %s ,m)
     return
})

//傳送訊息到webserver 
w。傳送什麼事了

就是這樣!

注意:不用說,訊息可以是字串以外的東西。一個自定義結構體例如!

處理幾個螢幕/顯示

//如果有幾個顯示,將視窗移動到第二個顯示器
var  displays = a。顯示()
如果 len(顯示)> 1 {
    時間。睡覺(時間第二
    W上。MoveInDisplay(顯示[ 1 ],5050
}

選單

//初始化一個新的應用程式選單
//您可以使用視窗
var  m = a執行相同的操作。NewMenu([] * astilectron。 MenuItemOptions {
    {
        標籤:astilectron。PtrStr Separator ),
        子選單:[] * astilectron。MenuItemOptions {
            {標籤:astilectron。PtrStr Normal 1 )},
            {
                標籤:astilectron。PtrStr Normal 2 ),
                的OnClick:FUNC(即astilectron 事件)(deleteListener 布林){
                    astilog。資訊正常2項已被點選返回
                },
            },
            {型別:astilectron。MenuItemTypeSeparator },
            {標籤:astilectron。PtrStr Normal 3 )},
        },
    },
    {
        標籤:astilectron。PtrStr複選框),
        子選單:[] * astilectron。MenuItemOptions {
            {檢查:astilectron。PtrBooltrue),標籤:astilectron。PtrStr複選框1 ),型別:astilectron。MenuItemTypeCheckbox },
            {標籤:astilectron。PtrStr複選框2 ),型別:astilectron。MenuItemTypeCheckbox },
            {標籤:astilectron。PtrStr複選框3 ),型別:astilectron。MenuItemTypeCheckbox },
        },
    },
    {
        標籤:astilectron。PtrStr Radio ),
        子選單:[] * astilectron。MenuItemOptions {
            {檢查:astilectron。PtrBooltrue),標籤:astilectron。PtrStr Radio 1 ),型別:astilectron。MenuItemTypeRadio },
            {標籤:astilectron。PtrStr Radio 2 ),型別:astilectron。MenuItemTypeRadio },
            {標籤:astilectron。PtrStr Radio 3 ),型別:astilectron。MenuItemTypeRadio },
        },
    },
    {
        標籤:astilectron。PtrStr角色),
        子選單:[] * astilectron。MenuItemOptions {
            {標籤:astilectron。PtrStr最小化),角色:astilectron。MenuItemRoleMinimize },
            {標籤:astilectron。PtrStr關閉),角色:astilectron。MenuItemRoleClose },
        },
    },
})

//檢索選單項
//這將檢索“複選框1”專案
mi _  := m。 1 0

//手動新增監聽器
//一個OnClick監聽器已經直接新增到另一個選單項 
mi的選項中(astilectron。 EventNameMenuItemEventClicked FUNC(E astilectron。事件 BOOL {
    astilog。Infof選單項已被點選。‘經過’現在狀態%T ,* E。MenuItemOptions經過返回 
})

//建立選單 
m。建立()

//操縱選單項 
mi。SetChecked true

//初始化一個新選單項
var  ni = m。的newitem(astilectron。 MenuItemOptions {
    標籤:astilectron PtrStr插入的),
    子選單:[] * astilectron MenuItemOptions {
        {標籤:astilectron。PtrStr插入1 )},
        {標籤:astilectron。PtrStr插入2 )},
    },
})

//將選單項插入位置“1” 
m。插入 1,ni)

//獲取子選單
s _  := m。子選單 0

//初始化一個新的選單項 
ni = s。的newitem(astilectron。 MenuItemOptions {
    標籤:astilectron PtrStr追加),
    子選單:[] * astilectron MenuItemOptions {
        {標籤:astilectron。PtrStr附加1 )},
        {標籤:astilectron。PtrStr附加2 )},
    },
})

//動態附加選單項追加(ni)

//彈出子選單作為上下文選單彈出(&astilectron。 MenuPopupOptions {PositionOptions:astilectron。 PositionOptions {X:astilectron PtrInt 50)中,Y:astilectron PtrInt 50)}})

//關閉彈出 
秒。ClosePopup()

//破壞選單 
m。毀滅()

要知道的幾件事情

  • 當將角色分配給選單項時,go-astilectron將無法捕獲其點選事件
  • 在MacOS上沒有視窗選單,只有應用程式選單,所以我的建議是堅持一個全球的應用程式選單,而不是建立單獨的視窗選單

對話方塊

在您的網路伺服器中,新增以下JavaScript之一來實現任何型別的對話。

錯誤框

< script >
    //這將等待astilectron名稱空間準備好
文件的addEventListener ' astilectron就緒'函式(){ //這將開啟對話方塊astilectron showErrorBox我的標題我的內容    })



< / script >

留言框

< script >
    //這將等待astilectron名稱空間準備好
文件的addEventListener ' astilectron就緒'函式(){ //這將開啟對話方塊astilectron showMessageBox({訊息我的資訊,標題我的標題 })    })



< / script >

開啟對話方塊

< script >
    //這將等待astilectron名稱空間準備好
文件