linux gui编程语言,使用 Red 语言编写 GUI 应用程序
一句話概括 — 使用 Red 語(yǔ)言編寫(xiě)原生跨平臺(tái)桌面 GUI。
嘗試在 Windows 上使用 PyInstaller 將“可執(zhí)行”的 ducktape 封裝在 Python 腳本之后,我發(fā)現(xiàn)應(yīng)該學(xué)習(xí)的編程語(yǔ)言類(lèi)應(yīng)該具有以下屬性:
靜態(tài)二進(jìn)制編譯(產(chǎn)生一個(gè)二進(jìn)制,不是運(yùn)行時(shí)的字節(jié)碼,例如 Java、Python)
快速
跨平臺(tái)(Windows,Mac,Linux,* BSD 和/或 Haiku (Bonus))
為了達(dá)到這個(gè)目的,在三年前我學(xué)會(huì)了 Go(開(kāi)始使用 Go 開(kāi)發(fā)一個(gè)應(yīng)用程序),我可以確定 Go 的二進(jìn)制文件可以通過(guò)交叉編譯在多個(gè)平臺(tái)上運(yùn)行。其他語(yǔ)言如 Crystal 和 Rust 也支持類(lèi)似機(jī)制,但當(dāng)時(shí)都不穩(wěn)定。今天,我正在探索原生跨平臺(tái)GUIs1的可選方案。
基于 Electron 構(gòu)建的“現(xiàn)代桌面應(yīng)用”已經(jīng)有很多了。它允許程序員用 HTML、CSS 和 JavaScript 來(lái)構(gòu)建桌面應(yīng)用程序。聽(tīng)起來(lái)真棒吧?好吧…
雖然 Electron 比較容易,快速面世并且對(duì)程序員而言成本效益更高,Electron 以二進(jìn)制大小和內(nèi)存使用量龐大2而臭名昭著。你可能遇到過(guò)唱衰使用它的帖子,基本上到了這種程度:如果任何應(yīng)用程序敢于使用它,幾乎可以保證它會(huì)在在線技術(shù)論壇上遭受抨擊。
令你失望的是,這不是其中抨擊帖子之一。Qt 和 GTK+ 是有趣的選擇,我甚至打算自己使用它們。但是,兩者都不如 Electron 那樣快速發(fā)展。我們可以兼用二者嗎?一個(gè)原生的可快速開(kāi)發(fā)的跨平臺(tái)GUI?不妨看看 Red。
Red
“Red 是受到 Rebol 強(qiáng)烈影響的下一代編程語(yǔ)言。”
Red 的誕生很大程度是受 Rebol 的影響,它是專(zhuān)有的封閉源碼軟件(直到2012年,Rebol 3才成為開(kāi)源軟件)。這兩種語(yǔ)言都有一個(gè)很好的圖形用戶(hù)界面系統(tǒng)(下面我們將介紹),Red 的不同之處在于它可以用于系統(tǒng)編程,使用名為 Red/System 的小于2MB DSL 編譯器。你可以在這里找到Red,并下載。
GUI
這有一個(gè)使用 Red GUI 系統(tǒng)的 “Hello World”。
Red 帶有解釋器,所以你可以輸入 red hello_world_gui.red 來(lái)運(yùn)行下面的代碼
Red []
view [ text "Hello World" ]
Red 會(huì)解釋運(yùn)行這段代碼,不需要編譯成二進(jìn)制。如果你希望能生成二進(jìn)制,就把代碼修改成下面這樣:
Red [ needs: 'View ]
view [ text "Hello World" ]
然后運(yùn)行:
red -r -c hello_world_gui.red
編譯結(jié)果是一個(gè)單獨(dú)的二進(jìn)制文件,運(yùn)行它會(huì)在 GUI 中顯示“Hello World”。目前在 Linux 下還不支持 GUI(還在實(shí)驗(yàn)階段),但是在 Windows 和 Mac 都是可以編譯的。Red 支持交叉編譯,以便你為不同的平臺(tái)編譯二進(jìn)制文件,我們可以看到 Red 能編譯出可用于哪些平臺(tái)的結(jié)果。
hako ~ red -h
...
Cross-compilation targets:
MSDOS : Windows, x86, console (+ GUI) applications
Windows : Windows, x86, GUI applications
WindowsXP : Windows, x86, GUI applications, no touch API
Linux : GNU/Linux, x86
Linux-ARM : GNU/Linux, ARMv5, armel (soft-float)
RPi : GNU/Linux, ARMv5, armhf (hard-float)
Darwin : macOS Intel, console or GUI applications
macOS : macOS Intel, GUI-only, applications bundles
Syllable : Syllable OS, x86
FreeBSD : FreeBSD, x86
Android : Android, ARMv5
Android-x86 : Android, x86
編寫(xiě)一個(gè)“Hello World”并沒(méi)什么用,讓我們通過(guò)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖像查看器以進(jìn)一步了解 Red 語(yǔ)言,在這里我們將得到一個(gè)隨機(jī)的圖像,這里是代碼:
Red [
title: "Simple Image Viewer"
author: "Wesley Hill"
version: 0.1
needs: 'View
]
rand_img: http://source.unsplash.com/random/310x200
message: "Press Random for a random image!"
view/options [title "Simple Image Viewer"
below center
pictures: image 310x200 message
across
random_btn: button "Random" [
new_image: load rand_img
pictures/image: new_image
pictures/text: ""
]
text "A Simple Image Viewer in Red"
][]
上面的代碼創(chuàng)建了兩個(gè)變量rand_img和message,我們使用view函數(shù)來(lái)調(diào)用Red的 VID dialect 和 View Engine,我們把標(biāo)題和布局設(shè)置在窗口的中心。我們的圖像大小為310×200,使用了 pair 數(shù)據(jù)類(lèi)型,并且將我們的按鈕 random_btn 和文本設(shè)置為相互響應(yīng)的。 最后,一旦我們點(diǎn)擊“隨機(jī)”按鈕,我們會(huì)使用加載函數(shù)從源檢索數(shù)據(jù)。 源需要提供一個(gè)路徑,可以是文件,字符串,二進(jìn)制或url數(shù)據(jù)類(lèi)型。
在這種情況下,我們使用rand_img中的url數(shù)據(jù)類(lèi)型,并通過(guò)將 pictures/image: 的值設(shè)置為新的圖像存放地址 new_image 以使用圖片。因?yàn)槲覀冎幌M@示圖像,所以我們將圖像中的文本設(shè)置為空。
我們可以通過(guò)內(nèi)置的 type? 功能檢查數(shù)據(jù)類(lèi)型。請(qǐng)注意,Red有超過(guò)50多種類(lèi)型。
>> print type? rand_img
url
>> print type? message
string
>>
一旦我們運(yùn)行上面的代碼,我們將得到簡(jiǎn)單的圖像瀏覽器
…它也能運(yùn)行于 Windows 上
Red 可用于更高級(jí)的應(yīng)用程序,這里有幾個(gè)例子:
自動(dòng)照片復(fù)印機(jī)
對(duì)于使用 Red 的更高級(jí)的應(yīng)用程序,我給我父親編寫(xiě)了一個(gè)程序來(lái)處理數(shù)百?gòu)堈掌O旅媸浅绦虻?GUI,我使用了一組隨機(jī)照片來(lái)演示程序
這些演示照片很小(平均約 5KB),我父親的照片,其大小通常在 14MB 左右,數(shù)量上千。
解析數(shù)據(jù)
輸入的數(shù)據(jù)實(shí)際上是一封電子郵件,其中包含客戶(hù)選擇的照片列表。
Selected the following images:
BIRTHDAY PARTY > ABC 7453
TIF_FILE_ID: 0123456789
BIRTHDAY PARTY > ABC 7454
TIF_FILE_ID: 0123456790
...
BIRTHDAY PARTY > ABC 8217
TIF_FILE_ID: 0123456899
所選照片的文件名采用 ABC_1234.jpg 的形式。所以對(duì)這個(gè)問(wèn)題使用正則表達(dá)式是有用的。此外,Red 有自己的模式匹配解析器,最初由 Rebol 發(fā)明,叫做 PARSE。
下面的正則表達(dá)式…
[A-Z]{3,}\s\d\S{3,}
…類(lèi)似于下面的 PARSE 規(guī)則:
[some letter space 4 digit opt letter]
給予以下字母和數(shù)字的規(guī)則:
letter: charset [#"A" - #"Z"]
digit: charset "0123456789"
解析規(guī)則中包含了選擇字母的原因是要捕獲有時(shí)出現(xiàn)在電子郵件中的 ABC 1234A 可選的邊框。 以下是介紹解析器如何看到這個(gè)規(guī)則:
使用 Red 解釋器,我們可以測(cè)試解析規(guī)則是否正在工作。對(duì)于成功的匹配返回 true,否則返回 false。
>> parse "ABC 1234" [some letter space 4 digit]
== true
>> parse "ABC 1234A" [some letter space 4 digit opt letter]
== true
>> parse "ABC 1234AB" [some letter space 4 digit opt letter]
== false
PARSE 是 Rebol/Red 特有的替代現(xiàn)在通用的正則表達(dá)式語(yǔ)法,大多數(shù)程序員(如果不是有經(jīng)驗(yàn)的程序員)都不太熟悉。 我花了一段時(shí)間來(lái)學(xué)習(xí)語(yǔ)法,我很欣賞這種語(yǔ)法,這些規(guī)則是用普通的英文,而不像正則表達(dá)式。
在用 Python 編寫(xiě)原型和測(cè)試之后花費(fèi)了我一個(gè)周末的時(shí)間編寫(xiě)這個(gè)應(yīng)用程序,它的代碼<220行。我的父親使用 Mac,所以生成一個(gè)二進(jìn)制文件就像在 macOS 的發(fā)行版中編譯源代碼一樣簡(jiǎn)單。
red -r -o "APC" -t macOS apc.red --red-only -v 4
它的大小甚至不到 2MB。
Lines 克隆
為了演示 Red 的網(wǎng)絡(luò)和序列化功能,我重新創(chuàng)建了一個(gè)名為 Lines 的應(yīng)用程序,它是一個(gè)簡(jiǎn)單的倫敦地鐵狀態(tài)應(yīng)用程序。不幸的是,它在 App Store 上已經(jīng)無(wú)法訪問(wèn)了,但我仍舊在舊的 iPhone 上安裝過(guò)。下面的圖片顯示了它的樣子。
下面是用 Red 實(shí)現(xiàn)的相同的應(yīng)用程序。 點(diǎn)擊“Lines”將彈出打開(kāi)關(guān)于特定路線的信息。
目前 Red 沒(méi)有內(nèi)置的 JSON 解析器。我發(fā)現(xiàn)一個(gè)在這個(gè)示例中已經(jīng)足夠用的 JSON 解析器。構(gòu)建這個(gè)應(yīng)用程序需要大約 3 天的空閑時(shí)間,大小約為 897 KB。
最后的想法
除了可以用 Linux 實(shí)現(xiàn)(一個(gè)可在 Red 工作的 GTK3 后端)的 GUI 系統(tǒng)之外,請(qǐng)注意,Red 目前可編譯 32 位二進(jìn)制文件。使用“Automated Photo Copier”應(yīng)用程序時(shí),我使用 Red 復(fù)制大圖片時(shí)遇到了問(wèn)題,而且程序經(jīng)常突然崩潰。我切換到使用 cp 復(fù)制照片(因?yàn)槲抑牢业陌职种皇褂?Mac)通過(guò)在 cp 命令上調(diào)用 call/console。這樣,它就能完美地復(fù)制圖像。如果他用 Windows,這將是一個(gè)不同的故事。
Red 是 Electron 的一個(gè)很好的替代嗎?如果你正在構(gòu)建一個(gè)小型的內(nèi)部工具,需要一個(gè)快速的圖形用戶(hù)界面或需要一個(gè)開(kāi)發(fā)難度較低的跨平臺(tái)的 GUI,那么答案是 yes。雖然現(xiàn)在 Red 還沒(méi)有達(dá)到產(chǎn)品級(jí),但從其路線圖來(lái)看,Red 在未來(lái)有很大的潛力。我不得不承認(rèn),如果你不熟悉 Rebol(下面有對(duì)應(yīng)的資源和鏈接),學(xué)習(xí)曲線會(huì)略微適中。另一個(gè)我還沒(méi)有嘗試的替代方案是 Lazarus(也許在未來(lái)的博客會(huì)介紹),但是用 Red 開(kāi)發(fā) GUI 的速度是非常有前途的。
Lines clone 代碼已在 GitHub 上開(kāi)源。
如果你有興趣了解關(guān)于 Red 的更多信息,請(qǐng)查看以下鏈接:
我已經(jīng)使用了久經(jīng)考驗(yàn)的 Python、Ruby、Java、C/++/# 和 JS,但是我想嘗試新的東西。就用 Go 編寫(xiě) GUI 而言,shiny 是實(shí)驗(yàn)性的,這還有 therecipe/qt,以及我個(gè)人的最?lèi)?ài),andlabs/ui。
也有一些高性能的 Electron 程序(Visual Studio Code),但這只是例外的,而不是常規(guī)的。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的linux gui编程语言,使用 Red 语言编写 GUI 应用程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux自动挂载fcoe存储,在sdb
- 下一篇: office365Outlook更改邮件