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
通常包括下載和解壓縮的語言繫結的責任astilectron
是electron
- 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個依賴關係:astilectron和Electron。.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 ],50,50) }
選單
//初始化一個新的應用程式選單 //您可以使用視窗 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。PtrBool(true),標籤:astilectron。PtrStr(“複選框1 ”),型別:astilectron。MenuItemTypeCheckbox }, {標籤:astilectron。PtrStr(“複選框2 ”),型別:astilectron。MenuItemTypeCheckbox }, {標籤:astilectron。PtrStr(“複選框3 ”),型別:astilectron。MenuItemTypeCheckbox }, }, }, { 標籤:astilectron。PtrStr(“ Radio ”), 子選單:[] * astilectron。MenuItemOptions { {檢查:astilectron。PtrBool(true),標籤: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名稱空間準備好 文件。