我之前在Matlab中使用GUI工具箱开发了GUI,现在我正在为我的项目使用常见的lisp。我需要开发一个可能有按钮,单选按钮,数字窗口等的GUI。
我只是想知道在Common Lisp中是否可行,以及是否有工具箱,相当容易使用和学习的库。我没有强大的编程背景,所以如果可能的话,我会尽量避免使用先进的东西 非常感谢你提前。
答案 0 :(得分:9)
我接下来建议使用LTK。
但是,如果您的要求超出LTK提供的范围(并且您可以花一些时间学习基本的JavaScript + HTML + CSS - 这可能意味着不能避免在问题中提到的“高级内容”),您可能会发现它用于为您的应用程序创建Web界面。
因为我找不到在CL中编写便携式 GUI的免费体面替代方案,所以我决定编写Web应用程序而不是桌面应用程序(并将它们用作桌面应用程序 - 即启动服务器在我打算使用该应用程序的计算机上,在浏览器中打开页面并将其视为桌面应用程序;如果我在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 :(得分:7)
查看LTK,它是与Tk GUI工具包交互的包装器。它很容易开始使用它应该足够简单的应用程序。
答案 2 :(得分:4)
如果您处于Unix-ish环境中,您可能需要尝试cl-gtk2或commonqt甚至CLIM。此外,您选择的UI工具包取决于您正在使用的Common Lisp实现。 Lisp Works和Allegro CL都带有自己的UI工具包,这些工具包可以(或多或少)与平台无关。
答案 3 :(得分:1)
到目前为止,我已经讨论了一些建议,根据我的经验,Qt和Gtk绑定可以完成工作,但是他们仍然觉得有点C / C ++ - ish,我不喜欢。我确实玩过LispWorks的免费版本,我对CAPI印象非常深刻,但此时我没有必要(和能力)投资商业许可证,所以除了玩这个例子我还没有做过任何事情。应用。
我将推荐调查基于Web的UI。尽管我不喜欢对浏览器进行编程,但现在有很多工具可以让它容忍,甚至可以让人愉快,Restas(基于Hunchentoot的框架)非常可爱。
答案 4 :(得分:1)
除了已经提到的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会自动处理窗口小部件的状态更改 - 只能给出正确的“管道”。
(这段代码已有几年了,我没有安装Cell-Gtk来测试ATM,但是当我编写它时它曾经正常工作。)