【问题标题】:Common Lisp Graphical User Interface DevelopmentCommon Lisp 图形用户界面开发
【发布时间】:2012-02-15 19:57:50
【问题描述】:

我之前在 Matlab 中使用 GUI 工具箱开发了 GUI,现在我正在为我的项目使用 common lisp。我需要开发一个可能有按钮、单选按钮、图形窗口等的 GUI。

我只是想知道在 Common Lisp 中这样做是否可行,以及是否有工具箱、库相当容易使用和学习。我没有很强的编程背景,所以如果可能的话,我会尽量避免高级的东西。
非常感谢您。

【问题讨论】:

  • common lisp gui toolkit 的网络搜索似乎出现了几个,所以我认为可行性是有保证的。
  • 2020 年更新:这里是对 Tk、Qt4、Gtk3、IUP 和 Nuklar 的介绍:lispcookbook.github.io/cl-cookbook/gui.html

标签: user-interface common-lisp


【解决方案1】:

我赞同使用LTK 的建议。

但是,如果您的要求超出了 LTK 提供的范围(并且您可以花一些时间学习基本的 JavaScript+HTML+CSS - 这可能意味着不要避免您在问题中提到的“高级内容”),您可能会发现它对于为您的应用程序创建 Web 界面很有用。

因为我找不到在 CL 中编写可移植 GUI 的免费体面替代方案,所以我决定编写 Web 应用程序而不是桌面应用程序(并将它们用作桌面应用程序 - 即启动服务器在我打算使用应用程序的计算机上,在浏览器中打开页面并将其视为桌面应用程序;如果有我无法在 JavaScript 中执行的操作,例如访问网络等,我会在服务器上执行)。这具有很好的可移植性优势(现在这意味着我在 Linux 上使用 SBCL 进行开发,并在 Windows 上使用 Clozure CL 进行部署,到目前为止效果很好)。

我目前对这样一个应用程序的进展非常满意,使用Hunchentoot(托管内容)+Parenscript(CLize JavaScript)+JQuery(驯服浏览器不兼容性)+JQueryUI (驯服在浏览器中编写 UI)。不用担心 JS 性能,现在是pretty spectacular(好吧,如果你有能力忽略早于 IE9 的 IE 并使用最近的浏览器)。几周前,我使用所有这些写了a simple 'hello world'-type application(JQueryUI 除外,但这很容易添加);作为我的意思的一个最小示例,它可能很有用。

【讨论】:

    【解决方案2】:

    看看LTK,它是一个用于与 Tk GUI 工具包交互的包装器。它很容易上手,对于简单的应用应该足够了。

    【讨论】:

    • 我也可以使用 Ltk 作为绘图工具吗?还是我使用 gnuplot 或其他绘图工具会更好?
    • 我从来没有这样使用过,但是 cgn (cliki.net/cgn) 似乎可以解决问题 - 只需使用 quicklisp 安装它并成功运行测试代码。
    【解决方案3】:

    如果您在 Unix-ish 环境中,您可能想尝试cl-gtk2commonqt 甚至CLIM。此外,您对 UI 工具包的选择取决于您使用的 Common Lisp 实现。 Lisp WorksAllegro CL 都带有自己的 UI 工具包,它们(或多或少)独立于平台工作。

    【讨论】:

      【解决方案4】:

      到目前为止,我已经尝试了一些建议,根据我的经验,Qt 和 Gtk 绑定可以完成工作,但它们仍然感觉有点 C/C++-ish,我不喜欢。我确实玩过 LispWorks 的免费版本,CAPI 给我留下了深刻的印象,但我现在没有必要(也没有能力)投资商业许可证,所以除了玩这个例子之外我从来没有做过任何事情应用。

      我将支持研究基于 Web 的 UI 的建议。尽管我不喜欢对浏览器进行编程,但如今有很多工具可以让它变得可以忍受,甚至可能令人愉快,Restas(基于 Hunchentoot 的框架)非常棒。

      【讨论】:

        【解决方案5】:

        除了已经提到的LTK(对我来说总是很好用),我还喜欢Cells-Gtk,因为在我看来,Tilton 的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来测试它的ATM,但是我写的时候它可以正常工作。)

        【讨论】:

          猜你喜欢
          • 2016-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-29
          • 1970-01-01
          • 1970-01-01
          • 2016-06-18
          • 2013-01-23
          相关资源
          最近更新 更多