2012-02-15 334 views
11

我在Matlab中使用GUI工具箱开发了GUI,现在我正在为我的项目使用通用的lisp。我需要开发一个可能有按钮,单选按钮,图形窗口等的图形用户界面。Common Lisp图形用户界面开发

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

+0

一个在网上搜索'Common Lisp的GUI工具包似乎有好几个,所以我认为可行性是有保证的。 – phils 2012-02-15 20:19:39

回答

7

看看LTK,它是一个与Tk GUI工具包接口的包装。开始使用它非常简单,只需简单的应用程序即可。

+0

我可以使用Ltk作为绘图工具吗?或者对我来说使用gnuplot或其他绘图工具会更好? – YBE 2012-02-16 21:44:30

+0

我从来没有像那样使用过它,但是cgn(http://www.cliki.net/cgn)似乎可以做到这一点 - 只需使用quicklisp安装它并成功运行测试代码即可。 – 2012-02-16 23:07:35

4

如果您处于Unix-ish环境中,则可能需要尝试cl-gtk2commonqt甚至CLIM。此外,您选择的UI工具包取决于您使用的Common Lisp实现。 Lisp WorksAllegro CL都带有自己的UI工具包,这些工具包可以独立工作(或多或少)。

9

我第二个建议使用LTK。然而,如果你的需求超出LTK提供的范围(你可以花一些时间学习基本的JavaScript + HTML + CSS - 这可能意味着你不会回避你在问题中提到的“高级内容”),你可能会发现它有助于为您的应用程序创建一个Web界面。

因为我无法找到一个免费的体面的替代品在CL写便携式图形用户界面,我决定写的网络应用程序,而不是桌面应用程序(并把它们作为桌面应用程序 - 即启动该服务器所在的计算机上我的意思是使用该应用程序,在浏览器中打开该页面并将其视为桌面应用程序;如果有某些我无法在JavaScript中执行的操作(例如访问网络等),则在服务器上执行)。这具有很好的可移植性(现在这意味着我使用SBCL在Linux上开发并使用Clozure CL在Windows上进行部署,到目前为止效果很好)。

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

1

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

我会继续推荐研究基于Web的UI。尽管我不喜欢编程浏览器,但现在有很多工具可以让它变得可以忍受,甚至可以很愉快,并且Restas(基于Hunchentoot的框架)非常好。

1

除了已经提到的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自动处理小部件的状态变化 - 只有正确的“管道”必须给出。

(此代码是几年老了,我也没有细胞-GTK安装到ATM测试,但它使用的正常工作,当我写的。)