| Vectorified Science Blog |

Free Vector Icons

Red dasturlash tilidan foydalanib GUI dasturlarini yozish

Tarjima qilingan maqola - Writing GUI apps using the Red Programming Language

Muallif(lar) - Wesley Hill

Maqolaning asl manbasi:

https://wesleyhill.co.uk/p/writing-gui-apps-using-the-red-programming-language/

TL;DR - Red-dan foydalanib, mahalliy platformalararo GUI-larni yozish.

2017 yil 19 dekabr

Red dasturlash tilidagi logotip

Windowsda PyInstallerdan foydalanib Python skriptining atrofida "bajariladigan" ducktape-ni o'rashga urinib ko'rganingizdan (va muvaffaqiyatsiz) so'ng, odatda mening qiziqishimni bildiradigan dasturlash tillari klassi quyidagi xususiyatlarga ega:

Uch yil oldin shu maqsadda Go ni tanlab (u bilan dastur ishlab chiqishni boshladim) Men Go ikkiliklari bir necha platformalarda o'zaro faoliyat kompilyatsiya orqali ishlashiga kafolat bera olaman. Kristal va Rust kabi boshqa tillar ham yuqoridagi katakchalarni belgilaydi, ammo ikkalasi ham o'sha paytda barqaror emas edi. Bugun men GUIs mahalliy o'zaro faoliyat platformasi variantlarini o'rganmoqdaman.

Electron yordamida ko'plab "zamonaviy ish stollari" yaratilmoqda. Bu dasturchilarga HTML, CSS va JavaScript bilan ish stoli dasturlarini yaratishga imkon beradi. Ajoyib ovozlar? Xo'sh ...

Electron osonroq, tezroq bozorga chiqarilishi va dasturchilar uchun tejamkor bo'lishiga qaramay, Electron ikkala hajmda ham, tezkor xotirada ishlatilishida ham ko'p miqdorda shishishi bilan mashhur. Ehtimol siz bu haqda shikoyat qiladigan xabarlarni ko'rishingiz mumkin, shu paytgacha elektron texnologiyalar forumida biron bir dastur uni ishlatishga jur'at etsa, Electronni yoqib yuborish deyarli kafolatlangan.

Sizning umidlaringiz uchun, bu xabarlarning biri emas. Qt va GTK + - bu qiziqarli alternativalar, men ulardan hatto o'zim foydalanishni rejalashtirmoqdaman. Biroq, ikkalasi ham Electron kabi tez rivojlanmaydi. Ikkalamiz ham bo'lishi mumkinmi ? GUI-ning mahalliy xoch platformasi, u ham tez rivojlanadimi? Redni kiriting .

Red

"Red - bu Rebol tomonidan ilhomlangan yangi avlod dasturlash tili."

Red rang, asosan, Rebol xususiy va yopiq dasturiy ta'minot tufayli ishlab chiqarilgan (Ya'ni, 2012 yilgacha Rebol 3 ochiq manba qilingan) . Ikkala til ham ajoyib GUI tizimiga ega (biz bunga kirishamiz), Redning farqi shundaki, uni Red / System deb nomlangan DSL bilan dasturlashda foydalanish mumkin va kompilyator ajablanarli darajada 2MB dan kam . Red haqida ko'proq ma'lumotni bu erda topishingiz mumkin va uni bu erda yuklab olishingiz mumkin.

GUI

Bu erda Redning GUI tizimidan foydalangan holda "Salom Dunyo".

Red tarjimon bilan birga keladi, shuning uchun siz red hello_world_gui.red terib quyidagi kodni ishlatishingiz mumkin.

 Red []
view [ text "Hello World" ]

Red ushbu kodni sharhlaydi va uni ikkilikga yozmasdan ishlaydi. Agar ikkilik ishlab chiqarishni xohlasangiz, kodni quyidagiga o'zgartiring.

 Red [ needs: 'View ]
view [ text "Hello World" ]

va yugurish:

red -r -c hello_world_gui.red

Ushbu kompozitsiyaning natijasi GUI-da "Salom Dunyo" so'zlarini ko'rsatadigan bitta ikkilikdir. Hozircha GUI qo'llab-quvvatlashi Linux-da mavjud emas (eksperimental), ammo kompilyatsiya Windows va Mac-da ishlaydi. Red xoch kompilyatsiyasini qo'llab-quvvatlaydi, shuning uchun siz boshqa platforma uchun ikkiliklarni tuzishingiz mumkin, biz Red kompilyatsiya qilishi mumkin bo'lgan mavjud xoch kompilyatsiya maqsadlarining ro'yxatini olishimiz mumkin.

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

"Hello World" unchalik foydali emas, lekin biz oddiy tasvir tomoshabiniga murojaat qilib, tasodifiy tasvirni olamiz, bu erda kod:

Red [
	title: "Simple Image Viewer"
	author: "Wesley Hill"
	version: 0.1
	needs: 'View
]

rand_img: https://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"
][]

rand_img va message ikkita o'zgaruvchisi yuqorida yaratilgan va biz Red funktsiyasining VID dialektini va View Engine ni chaqirish uchun view funktsiyasidan foydalanamiz, rand_img va rand_img o'rtasida bo'lishini belgilaymiz. Bizning rasmlarimiz pair ma'lumotlar 310x200 foydalangan holda 310x200 o'lchamda bo'ladi va biz random_btn va text bir-biriga random_btn . Va nihoyat, "Tasodifiy" tugmachasini bosgandan so'ng, biz manbadan ma'lumotlarni olish uchun load funktsiyasidan foydalanamiz. Manba yo'l, bo'lishi kerak, bu file , string , binary yoki url ma'lumotlar turi bo'lishi mumkin.

Bu holda biz rand_img ning url ma'lumot rand_img va biz o'z rand_img pictures/image: bilan rand_img : rand_img joylashgan yangi new_image . Biz faqat rasmimizni ko'rsatilishini xohlaymiz, shuning uchun rasmdagi matnni bo'sh qoldiramiz.

Ma'lumot turini turi bilan tekshirishimiz type? o'rnatilgan funksiya. E'tibor bering, Red rang 50 dan ortiq turga ega.

>> print type? rand_img
url
>> print type? message
string
>> 

Yuqoridagi kodni ishga tushirgandan so'ng biz oddiy rasm tomoshabinni olamiz!

... va u Windowsda ham ishlaydi

Red rangni yanada rivojlangan dasturlar uchun ishlatish mumkin, bu erda bir nechta:

Avtomatlashtirilgan foto kopiya

Red-dan foydalangan holda yanada takomillashtirilgan dastur uchun men dadamga yuzlab fotosuratlarni ko'chirish bilan shug'ullanadigan dastur yozdim. Quyida dasturning GUI mavjud, men dasturni namoyish qilish uchun tasodifiy fotosuratlar to'plamidan foydalanaman.

Ushbu demo fotosuratlar kichkina (~ 5KB), dadam ishlagan rasmlar minglab fotosuratlar dengizida odatda ~ 14MB fotosuratga tushadi.

Ma’lumotlarni sintaktik tahlil qilish

Kirish ma'lumotlari aslida mijoz tanlagan fotosuratlar ro'yxatini o'z ichiga olgan elektron pochta xabaridir.

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

Tanlangan fotosuratlarning nomi ABC_1234.jpg shaklida. Shunday qilib, ushbu muammo uchun Muntazam Iboralarni ishlatish mantiqiy bo'ladi. Buning o'rniga, Red-da Parbol deb nomlangan PARSE tomonidan ixtiro qilingan o'ziga xos naqshli sintaktik tahlil mavjud.

Quyidagi oddiy ibora ...

[A-Z]{3,}\s\d\S{3,}

... quyidagi PARSE qoidasiga o'xshash:

[some letter space 4 digit opt letter]

Quyidagi letter va digit qoidalariga rioya qilgan holda:

letter: charset [#"A" - #"Z"]
digit:  charset "0123456789"

opt letter sintaktik qoidalarga kiritilishining sababi, ba'zida elektron pochtada paydo bo'ladigan ABC 1234A ixtiyoriy tahrirlovchisini olishdir. Quyida tahlil qiluvchi ushbu qoidani qanday ko'rishini ko'rib chiqamiz:

Red tarjimondan foydalanib, tahlil qilish qoidasi ishlayotganligini sinab ko'rishimiz mumkin. Muvaffaqiyatli o'yinlarda PARSE true va false qiymatni qaytaradi.

>> 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 - bu universal tajribaga asoslangan oddiy iboralar sintaksisining Rebol / Red o'ziga xos alternativasi bo'lib, uni ko'pchilik tajribali dasturchilar yaxshi bilishmaydi. Sintaksisni o'rganish uchun bir muncha vaqt kerak bo'ldi va men regexdan farqli o'laroq, qoidalar oddiy o'qiladigan ingliz tilida ekanligini anglayman.

Ushbu dasturni yozish men uchun bir hafta oxiri prototip tayyorlash va Python-da sinovdan o'tkazgandan so'ng amalga oshirildi, bu <220 qator kodi. Mening dadam Mac-dan foydalanadi, shuning uchun ikkilik yaratish MacOS uchun reliz rejimida manbani kompilyatsiya qilish kabi oson.

red -r -o "APC" -t macOS apc.red --red-only -v 4

va bu hatto 2MB emas va u. shunchaki. ishlaydi.™

Chiziqlar kloni

Red-ning tarmoqqa ulanish va seriyalash qobiliyatini namoyish qilish uchun men telefonimda Lines deb nomlangan ilovani yaratdim, bu oddiy London naychalari holati ilovasi. Afsuski, u endi App Store do'konida mavjud emas, ammo men uni eski iPhone-da saqlayman. O'ng tomondagi rasm uning qanday ko'rinishini ko'rsatadi.

Quyida Red rangda amalga oshirilgan xuddi shunday ilova. "Lines" tugmachasini bosish orqali ma'lum bir naycha liniyasi haqida ochiq ma'lumotlar paydo bo'ladi.

Hozirda Red-ning ichiga o'rnatilgan JSON analizatori yo'q. Men JSON tahlil qiluvchisini topdim bu namoyish uchun etarli darajada yaxshi edi. Ushbu ilovani yaratish uchun 3 kunlik bo'sh vaqt sarflandi va hajmi 897KB ni tashkil etdi.

Yakuniy fikrlar

Linux-ni amalga oshirishi mumkin bo'lgan GUI tizimidan tashqari (GTK3-versiyasi Red uchun ishlaydi), shuni yodda tutingki, Red hozirda 32bit-da ikkiliklarni kompilyatsiya qilmoqda . Avtomatik fotosurat nusxasi dasturi yordamida men Red-dan katta rasmlarni nusxalashda muammolarga duch keldim va ko'pincha dastur to'satdan qulab tushdi. Suratlarni nusxalash uchun cp ga o'tdim (chunki dadam faqat Mac-dan foydalanayotganini bilgan edim) cp buyrug'iga call/console orqali. Shu nuqtada u rasmlarni mukammal ravishda nusxa ko'chiradi. Agar u Windows o'rniga uning o'rniga foydalangan bo'lsa, bu boshqa voqea bo'ladi.

Red Electronga yaxshi alternativami? Agar siz tez GUI talab qiladigan yoki kam rivojlangan bosh og'rig'i bo'lgan o'zaro faoliyat platforma GUI talab qiladigan kichik ichki vositani qurayotgan bo'lsangiz, ha . Bu hali ishlab chiqarish uchun tayyor emas, ammo Red kelajakda ularning yo'l xaritasini ko'rib chiqishda juda katta imkoniyatlarga ega. Tan olishim kerak, agar siz Rebol bilan tanish bo'lmagan bo'lsangiz (egri chiziqlar va quyidagi havolalar) o'rganish egri biroz mo''tadil. Men Lazarusni sinab ko'rishim kerak bo'lgan yana bir alternativa (ehtimol kelajakdagi blogpostda!), Lekin Redda GUI-ni rivojlantirish tezligi juda istiqbolli.

Lines klon kodi GitHub-da ochiq manba hisoblanadi.

 

Agar siz Red ranglar haqida ko'proq bilmoqchi bo'lsangiz, ushbu havolalarni ko'rib chiqing:

Helpin'Red - (tavsiya etiladi)

Rebol hujjatlari - (tavsiya etiladi)

Red til daftarchasi - (tavsiya etiladi)

Rebol Core foydalanuvchilar uchun qo'llanma

Red rasmiy hujjatlar - (ozgina to'liq emas)

Red qo'llanmalar va jamoat materiallari

Misol bo'yicha Red

 

  1. Python, Ruby, Java, C/++/# va JS,, lekin yangi narsalarni sinab ko'rmoqchi edim. Go uchun GUI nuqtai nazaridan shiny eksperimental bo'lib, u erda therecipe/qtva mening eng sevimli, andlabs/ui.

  2. Elektron ijrochilarning ba'zi bir ilovalari (Visual Studio Code) mavjud, ammo bu qoida emas, istisno.