Подтвердить что ты не робот

Общий Lisp Разработка графического пользовательского интерфейса

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Например, вот какой-то код для очень простого конвертера Fahrenheit/Celsius (и наоборот), который я написал, когда я только начинал с 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, чтобы проверить его ATM, но он работал правильно, когда я его написал.)