Разработка графического пользовательского интерфейса Common Lisp - PullRequest
12 голосов
/ 15 февраля 2012

Я разработал GUI ранее в Matlab, используя набор инструментов GUI, и сейчас я использую общий lisp для своего проекта. Мне нужно разработать графический интерфейс, который может иметь кнопку, переключатель, окно с рисунком и т. Д.

Я просто хочу узнать, выполнимо ли это сделать в Common Lisp и есть ли наборы инструментов, библиотеки, которые довольно легко использовать и изучать. У меня нет сильного опыта программирования, поэтому я постараюсь по возможности избегать сложных вещей.
Заранее большое спасибо.

Ответы [ 5 ]

9 голосов
/ 16 февраля 2012

Второе предложение использовать LTK .

Однако, если ваши требования выходят за рамки того, что обеспечивает LTK (и вы можете позволить себе потратить некоторое время на изучение базовых JavaScript + HTML + CSS - это, вероятно, означает, что вам не нужно избегать "продвинутых вещей", которые вы упомянули в вопросе), вы можете найти их полезно сделать веб-интерфейс для вашего приложения.

Поскольку я не мог найти бесплатную достойную альтернативу написанию портативных графических интерфейсов в CL, я решил написать веб-приложения вместо настольных приложений (и использовать их в качестве настольных приложений - то есть запустить сервер на компьютер, на котором я хочу использовать приложение, открыть страницу в браузере и рассматривать ее как приложение для настольного компьютера; если что-то я не могу сделать в JavaScript, например, получить доступ к сети и т. д., я делаю это на сервере) , Это имеет преимущество большой переносимости (сейчас это означает, что я занимаюсь разработкой для Linux с использованием SBCL и развертыванием на Windows с использованием Clozure CL, и пока это прекрасно работает).

В настоящее время я весьма доволен продвижением такого приложения, используя Hunchentoot (для размещения содержимого) + Parenscript (для CLize JavaScript) + JQuery (для укрощения несовместимости браузера) + JQueryUI (для укрощения написания пользовательского интерфейса в браузерах). Не беспокойтесь о производительности JS, в наши дни довольно впечатляюще (хорошо, если вы можете позволить себе игнорировать IE раньше, чем IE9 и использовать недавний браузер). Несколько недель назад я написал простое приложение типа 'hello world' , использующее все это (кроме JQueryUI, но его легко добавить); это может быть полезным в качестве минимального примера того, что я имею в виду.

7 голосов
/ 16 февраля 2012

Взгляните на LTK , который является оболочкой для взаимодействия с инструментарием Tk GUI. С ним довольно легко начать работу, и этого достаточно для простого применения.

4 голосов
/ 16 февраля 2012

Если вы работаете в среде Unix, вы можете попробовать cl-gtk2 или commonqt или даже CLIM .Кроме того, ваш выбор инструментария пользовательского интерфейса зависит от того, какую реализацию Common Lisp вы используете. Lisp Works и Allegro CL оба поставляются с собственными наборами инструментов пользовательского интерфейса, которые работают (более или менее) независимо от платформы.

1 голос
/ 16 февраля 2012

Помимо уже упомянутых LTK (которые всегда хорошо работали для меня), мне также нравятся Cells-Gtk , потому что Cells Тилтона находятся в На мой взгляд, хороший подход к написанию кода GUI. (Тем не менее, LTK может быть легче начать.)

Например, вот код для очень простого конвертера Фаренгейта / Цельсия (и наоборот), который я написал, когда только начинал с Cells-Gtk:

(defun fahrenheit->celsius (fahrenheit/string)
  (princ-to-string (handler-case
                       (* (- (read-from-string fahrenheit/string nil) 32) 5/9)
                     (error () "NaN"))))

(defun celsius->fahrenheit (celsius/string)
  (princ-to-string (handler-case
                       (+ (* (read-from-string celsius/string nil) 9/5) 32)
                     (error () "NaN"))))

(defmd celsius-fahrenheit-converter (gtk-app)
  :title "°C <-> °F"
  :position :center
  :kids
  (kids-list?
   (mk-vbox
    :kids
    (kids-list?
     (mk-hbox
      :kids
      (kids-list?
       (mk-entry :md-name :celsius
                 :init "0"
                 :text (c? (fahrenheit->celsius (widget-value :fahrenheit))))
       (mk-label :text "°C")))
     (mk-hbox
      :kids
      (kids-list?
       (mk-entry :md-name :fahrenheit
                 :text (c? (celsius->fahrenheit (widget-value :celsius))))
       (mk-label :text "°F")))))))

Нет кнопки «Рассчитать» или чего-то в этом роде - просто измените значение одного поля ввода, а другое будет обновлено на лету. Как вы можете видеть, Cells автоматически обрабатывает изменения состояния виджетов - необходимо указать только правильное «соединение».

(Этому коду несколько лет, и у меня нет установки Cells-Gtk для тестирования банкомата, но он работал нормально, когда я его писал.)

1 голос
/ 16 февраля 2012

Пока что я поиграл с несколькими предложениями, по моему опыту привязки Qt и Gtk справляются с работой, но они все еще чувствуют себя немного в C / C ++ - иш, что мне не нравится.Я поигрался с бесплатной версией LispWorks и был впечатлен CAPI, но у меня нет необходимости (и возможности) вкладывать деньги в коммерческую лицензию, поэтому я никогда не делал ничего, кроме как поиграться с примеромПрограммы.

Я рекомендую ознакомиться с веб-интерфейсом.Как бы мне не нравилось программировать браузер, в наши дни есть много инструментов, чтобы сделать его терпимым и, возможно, даже приятным, и Restas (фреймворк, основанный на Hunchentoot) довольно приятен.

...