2012-02-15 35 views
11

Tôi đã phát triển GUI trước đây trong Matlab bằng hộp công cụ GUI và ngay bây giờ tôi đang sử dụng lisp chung cho dự án của mình. Tôi cần phát triển GUI có thể có nút ấn, nút radio, cửa sổ hình, v.v.Phát triển giao diện người dùng đồ họa Lisp thường gặp

Tôi chỉ muốn biết liệu có thể thực hiện điều này trong Common Lisp hay không và có hộp công cụ, thư viện khá dễ sử dụng và học hỏi. Tôi không có nền tảng lập trình mạnh nên tôi sẽ cố gắng tránh những thứ nâng cao, nếu có thể.
Cảm ơn bạn rất nhiều trước.

+0

Một tìm kiếm web cho 'toolkit gui lisp chung 'dường như có nhiều thứ, vì vậy tôi nghĩ rằng tính khả thi được đảm bảo. – phils

Trả lời

7

Hãy xem LTK, là trình bao bọc để giao tiếp với bộ công cụ GUI Tk. Nó khá dễ dàng để bắt đầu với nó và nó sẽ đủ cho ứng dụng đơn giản.

+0

Tôi có thể sử dụng Ltk làm công cụ vẽ đồ thị không? hoặc nó sẽ tốt hơn cho tôi để sử dụng gnuplot hoặc một số công cụ vẽ đồ thị khác? – YBE

+0

Tôi chưa bao giờ sử dụng nó như vậy, nhưng cgn (http://www.cliki.net/cgn) dường như làm các trick - chỉ cần cài đặt nó với quicklisp và chạy thành công mã kiểm tra. –

4

Nếu bạn đang ở trong môi trường Unix-ish, bạn có thể muốn thử cl-gtk2 hoặc commonqt hoặc thậm chí CLIM. Bên cạnh đó, sự lựa chọn của bạn về bộ công cụ giao diện người dùng phụ thuộc vào việc triển khai Common Lisp bạn đang sử dụng. Lisp WorksAllegro CL đều đi kèm với bộ công cụ giao diện người dùng của riêng chúng, hoạt động độc lập (nhiều hay ít) nền tảng.

9

Tôi thứ hai đề xuất sử dụng LTK. Tuy nhiên, nếu yêu cầu của bạn vượt quá những gì LTK cung cấp (và bạn có thể dành thời gian học JavaScript cơ bản + HTML + CSS - điều đó có nghĩa là không tránh "nội dung nâng cao" bạn đề cập trong câu hỏi), bạn có thể tìm thấy hữu ích khi tạo giao diện web cho ứng dụng của bạn.

Vì tôi không thể tìm thấy cách thay thế hoàn toàn miễn phí để viết GUI GUI trong CL, tôi quyết định viết ứng dụng web thay vì ứng dụng dành cho máy tính để bàn (và sử dụng chúng làm ứng dụng dành cho máy tính để bàn) Ý tôi là sử dụng ứng dụng, mở trang trong trình duyệt và coi nó là ứng dụng dành cho máy tính để bàn; nếu có điều gì đó tôi không thể làm trong JavaScript, chẳng hạn như truy cập mạng, v.v., tôi thực hiện trên máy chủ). Điều này có lợi thế về tính di động tuyệt vời (ngay bây giờ điều này có nghĩa là tôi phát triển trên Linux bằng SBCL và triển khai trên Windows bằng Clozure CL, và nó hoạt động rất tốt cho đến nay).

Tôi hiện đang khá hài lòng với sự tiến bộ trên một ứng dụng như vậy, sử dụng Hunchentoot (để lưu trữ các nội dung) + Parenscript (để CLize JavaScript) + JQuery (để chế ngự sự không tương thích trình duyệt) + JQueryUI (để chế ngự viết UI trong các trình duyệt). Đừng lo lắng về hiệu suất JS, nó là pretty spectacular những ngày này (tốt, nếu bạn có thể đủ khả năng để bỏ qua IEs sớm hơn IE9 và sử dụng một trình duyệt gần đây). Một vài tuần trước, tôi đã viết a simple 'hello world'-type application bằng cách sử dụng tất cả những điều này (ngoại trừ JQueryUI, nhưng thật dễ dàng để thêm); nó có thể hữu ích như một ví dụ tối thiểu về ý tôi.

1

Tôi đã chơi xung quanh với một vài gợi ý từ trước đến nay, theo kinh nghiệm của tôi về việc kết buộc Qt và Gtk hoàn thành công việc, nhưng họ vẫn cảm thấy một chút C/C++ - ish mà tôi không thích. Tôi đã chơi xung quanh với phiên bản miễn phí của LispWorks và tôi khá ấn tượng với CAPI, nhưng tôi không cần (và khả năng) để đầu tư vào một giấy phép thương mại vào thời điểm này nên tôi chưa bao giờ làm bất cứ điều gì khác ngoài việc chơi xung quanh với ví dụ ứng dụng.

Tôi sẽ thứ hai đề xuất xem xét giao diện người dùng dựa trên web. Nhiều như tôi không thích lập trình trình duyệt, có rất nhiều công cụ những ngày này để làm cho nó chấp nhận được, và thậm chí có thể thú vị, và Restas (một khuôn khổ dựa trên Hunchentoot) là khá ngọt ngào.

1

Bên cạnh đã được đề cập LTK (luôn làm việc tốt cho tôi), tôi cũng thích Cells-Gtk, vì theo tôi, cách tiếp cận tốt đẹp để viết mã GUI là của Tilton là Cells. (Tuy nhiên, LTK có thể dễ dàng hơn để bắt đầu.)

Ví dụ, đây là một số mã cho bộ chuyển đổi đơn giản Fahrenheit/Celsius (và ngược lại) tôi đã viết khi tôi mới bắt đầu với 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"))))))) 

Không có nút "Tính toán" hoặc thứ gì đó tương tự - chỉ cần thay đổi giá trị của một trường nhập và trường khác sẽ được cập nhật nhanh chóng. Như bạn có thể thấy, Các ô xử lý các thay đổi trạng thái của các tiện ích theo cách tự động - chỉ phải có "đường ống dẫn" chính xác.

(mã Đây là một vài tuổi, và tôi không có cài đặt tế bào-Gtk để kiểm tra nó ATM, nhưng nó được sử dụng để hoạt động đúng khi tôi đã viết nó.)

Các vấn đề liên quan