Створення GUI додатків за допомогою wxErlang
Пам'ятаєте, як нещодавно ми з вами збирали deb-пакет Erlang з підтримкою wxWidgets? Як ви могли здогадатися, все це було непросто. І справді, то була лише підготовка до цієї нотатки, присвяченої створенню GUI додатків мовою Erlang.
Отже, щоб отримати Erlang за допомогою wxWidgets під Linux, вам може знадобитися зібрати Erlang з вихідних джерел. Під FreeBSD досить встановити Erlang з портів, не забувши поставити відповідну галочку. Під Windows потрібно встановити бінарний пакет, доступний на erlang.org.
При використанні wxWidgets я волію генерувати XRC-файл у wxGlade, а не програмувати GUI вручну. Такий підхід не тільки зручніше, а й автоматично призводить до поділу думки і логіки додатку.
Встановлення wxGlade у Debian/Ubuntu:
sudo apt-get install python-wxglade
Встановлення у FreeBSD:
portmaster -d devel/wxGlade
Поколупавшись трохи в wxGlade я склав зовсім нікчемний, але цілком застосовний для навчальних цілей інтерфейс.
Так він виглядає в Xubuntu:

А так - під Windows:

Добре, інтерфейс у нас є. Зараз необхідно змусити його робити щось більш-менш осмислене:
#!/usr/bin/env escript %%! -smp enable -mode(compile).
-include_lib("wx/include/wx.hrl"). -define(MENU_EXIT, 101). -define(MENU_TUTORIAL, 102). -define(MENU_ABOUT, 103).
main(_Args) -> Wx = wx:new(), Xrc = wxXmlResource:get(),


initCallbacks(Frame) -> wxFrame:connect(Frame, close_window),
InfileBrowseButton = wxXmlResource:xrcctrl(Frame, "InfileBrowseButton", wxButton), InfileTextCtrl = wxXmlResource:xrcctrl(Frame, "InfileTextCtrl",wxTextCtrl),
onMenuSelected(Event,_) -> case Подія #wx< > wxFrame:close(Frame); #wx< > wx_misc:launchDefaultBrowser("http://eax.me/wxerlang/"); #wx< > Діалог = wxMessageDialog:new(Frame, "приклад wxErlang\n" "(c) Алекс Алексєєв 2012\n" "http://eax.me", [ < caption, "wxErlang example" >,

onInfileBrowseButtonClicked( #wx < userData = < Frame, InfileTextCtrl>>,_) -> Діалог = wxFileDialog:new(Frame), wxDialog:showModal(Діалог), FilePath = wxFileDialog:getPath(Діалог),

wxFileDialog:destroy(Dialog), wxTextCtrl:setValue(InfileTextCtrl, FilePath).
eventLoop(Frame) -> отримати #wx < подія = #wxClose<>> -> добре; Подія -> io:format("eventLoop:
n", [Подія]), eventLoop(Frame) кінець.
Главные моменты здесь последующие.
У файлі wx.hrl містяться визначення деяких записів (записів) і макросів. Без него нам пришлось бы написать:

… і відчувати остальные неудобства. Кстати, розглянемо функцію eventLoop:
eventLoop(Frame) -> отримати #wx < подія = #wxClose<>> -> добре; Подія -> io:format("eventLoop:
n", [Подія]), eventLoop(Frame) кінець.
По суті вона просто виводить у STDOUT усі повідомлення, крім тих, для яких ми написали колбеки (див. нижче). При отриманні повідомлення про закриття головного вікна (1-й клоз) ми виходимо з eventLoop і повертаємося в функцію main, де відбувається завершення додатка:
Чуток вище за кодом ви могли побачити:
Тут ми задаємо малий розмір вікна — ми ж не бажаємо, щоб юзер міг свернути його в одну точку? Чому-небудь у wxGlade не передбачена можливість показуватиналежні характеристики, отже доводиться робити це у коді.
Що цікаво, у віконному менеджері i3 розмір вікна все одно можна змінювати, як заманеться. У Xfce та під Windows все ОК.
При натисканні по будь-якому пункту меню буде викликана функція onMenuSelected:
onMenuSelected(Event,_) -> case Event of #wx< > wxFrame:close(Frame);
Якщо користувач натиснув «File → Exit», закриваємо вікно програми. При цьому ми автоматично вийдемо з eventLoop, в результаті чого програма закінчить свою роботу. Зверніть увагу, як відбувається передача даних через userData.
Макроси MENU_EXIT, MENU_TUTORIAL і MENU_ABOUT - це числові ідентифікатори пункту меню. Чомусь ідентифікатори, зазначені у wxGlade, ігноруються. Мені довелося знайти їх експериментальним способом.
Створення GUI додатків у MATLAB. Частина 1
При натисканні «Help → Tutorial» показуємо користувачеві сторінку, яку ви читаєте зараз. У FreeBSD браузер по дефлоту визначається перебором трьох видів - firefox, мозилла і netscape. Щоб все запрацювало, мені довелося зробити сімлінк:
ln -s /usr/local/bin/chrome /usr/local/bin/firefox
А може це все через те, що я користуюся i3?

При натисканні «Help → About» показуємо користувачеві віконце з інформацією про програму.
InfileBrowseButton = wxXmlResource:xrcctrl(Frame, "InfileBrowseButton", wxButton), InfileTextCtrl = wxXmlResource:xrcctrl(Frame, "InfileTextCtrl", wxTextCtrl),
Знаходимо кнопку "Browse" і поле введення зліва від неї. Говоримо при натисканні на кнопку викликати функцію onInfileBrowseButtonClicked. Імена всіх елементів управління можна вказати в wxGlade (але знайти певний пункт меню і повісити колбек на клік по ньому мені не вдалося).
onInfileBrowseButtonClicked( #wx < userData = < Frame, InfileTextCtrl>>,_) -> Dialog = wxFileDialog:new(Frame), wxDialog:showModal(Dialog), FilePath = wxFileDialog:getPath(Dialog), wxFileDialog:destroy(Dialog), wxTextCtrl:setValue (InfileTextCtrl, FilePath).
При натисканні на кнопку "Browse" просимо користувача вибрати файл, після чого в полі введення відображаємо повний шлях до цього файлу.
Загалом, це все! Чи бачите, нічого складного в розробці GUI додатків на Erlang немає. Всі вихідники до цієї нотатки ви можете знайти в цьому архіві або в репозиторії на BitBucket.
Як джерела додаткової інформації можна порекомендувати:
- Хороший туторіал по сабжу;
- Вичерпна довідка по wxErlang;
- Про дії і таке інше;
Якщо під час читання нотатки у вас виникли запитання, я радий на них відповісти. Доповнення та вказівки на помилки/некоректності також не забороняються.
Додаток: Див також нотатку про парсинг видачі Google на Erlang.
Схожі статті
Одна з проблем інтерпретованих мов залежить від скриптів від наявності у користувача відповідного інтерпретатора і модулів, використовуваних у коді скрипта. У світі UNIX ці проблеми.
У цій статті ми познайомимося з утилітою sbt. Ми навчимося збирати за її допомогою проекти на Scala, встановлювати сторонні бібліотеки, також дізнаємося, як зібрати jar, який буде працювати на будь-який.
У цій нотатці йтиметься про розробку кросплатформових GUI додатків мовою програмування Haskell з використанням бібліотеки wxWidgets. Підвищена увага буде приділена зменшенню розміру ін.