我以前使用GUI工具箱在Matlab中开发过GUI,现在我的项目使用的是通用的lisp。我需要开发一个GUI,它可能有一个按钮、单选按钮、图形窗口等。
我只想知道在Common Lisp中这样做是否可行,是否有易于使用和学习的工具箱和库。我没有很强的编程背景,所以如果可能的话,我会尽量避免高级的东西
事先非常感谢。
我支持使用LTK的建议。
然而,如果您的需求超出了LTK所提供的范围(并且您可以花一些时间学习基本的JavaScript+HTML+CSS,这可能意味着不必避免您在问题中提到的"高级内容"),您可能会发现为应用程序制作web界面很有用。
因为我找不到在CL中编写可移植GUI的免费、体面的替代方案,我决定写网络应用程序而不是桌面应用程序(并将其用作桌面应用程序——也就是说,在我想要使用应用程序的计算机上启动服务器,在浏览器中打开页面,并将其视为桌面应用程序;如果有我无法用JavaScript做的事情,例如访问网络等,我会在服务器上做)。这具有很好的可移植性(现在这意味着我使用SBCL在Linux上开发,并使用Clozure CL在Windows上部署,到目前为止效果很好)。
我目前对这样一个应用程序的进展感到非常满意,使用Hunchetoot(托管内容)+Parenscript(CLize JavaScript)+JQuery(驯服浏览器不兼容)+JQueryUI(驯服在浏览器中编写UI)。不用担心JS的性能,现在它非常出色(好吧,如果你能忽略IE9之前的IE并使用最近的浏览器)。几周前,我使用所有这些编写了一个简单的"helloworld"类型的应用程序(除了JQueryUI,但添加起来很容易);作为我的意思的一个最小的例子,它可能是有用的。
看看LTK,它是一个用于与Tk GUI工具包接口的包装器。它很容易上手,对于简单的应用程序来说应该足够了。
如果您在Unix环境中,您可能想要尝试cl-gtk2或commonqt,甚至CLIM。此外,UI工具包的选择取决于您正在使用的Common Lisp实现。Lisp Works和Allegro CL都有自己的UI工具包,它们(或多或少)与平台无关。
到目前为止,我已经讨论了一些建议,根据我的经验,Qt和Gtk绑定完成了任务,但它们仍然感觉有点C/C++风格,我不喜欢。我确实玩过免费版本的LispWorks,CAPI给我留下了深刻的印象,但我现在没有必要(也没有能力)投资商业许可证,所以除了玩示例应用程序之外,我从来没有做过其他事情。
我将支持研究基于web的UI的建议。尽管我很不喜欢对浏览器进行编程,但现在有很多工具可以让它变得可以忍受,甚至可以让它愉快,Restas(一个基于Hunchetoot的框架)非常不错。
除了已经提到的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,但当我写它的时候,它曾经正常工作。)