2012-02-15 153 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測試,但它使用的正常工作,當我寫的。)