如何使用Lisp制作GUI:DrScheme或Common Lisp

13

创建GUI需要做的基本工作是什么?我了解GUI的基本组件,但不知从何处开始。我是一个自学者,正在阅读《如何设计程序》(HtDP)。在书的结尾,作者建议程序员需要了解GUI和CGI计算机网络的知识。关于最后两个方面的信息很容易找到。但是好像很少有书籍谈到如何创建GUI。我猜想这可能是因为在计算机程序设计过程中它太“底层”,很少有人关注。


3
网页也是一个图形用户界面(GUI)。 - leppie
4个回答

11

9
  • 如果您想在Common Lisp中制作简单的GUI,我认为您最好选择LTK,它是Tcl/Tk脚本库的高级接口。
  • 还有很多其他选择,但它们需要一些实现目标的视野。如果您想使用广泛使用的GUI工具包(如GTK或Qt),则有CL-GTK2和CommonQt。但首先您必须充分了解这些工具包的工作原理。
  • LispWorks提供了一个非常复杂的GUI构建器库CAPI,它是跨平台的。
  • 在Mac上,ClozureCL拥有良好的Cocoa绑定。
  • 最后,有一个完整的本地CL GUI解决方案-McCLIM-非常灵活,但涉及较多。

此外,如果您想从理论角度了解GUI并学习它,您应该学习各种GUI模式,例如MVC、Model2、MVVM等。我不知道任何在Lisp中实现这些模式的GUI框架,因此进行这样的项目可能是一次有趣的学习经历...


1
Clozure CL在Windows上也有Cocoa绑定。使用Cocotron。 - Rainer Joswig

8
有一个轻量级的库可以通过2htdp / universe编写简单的图形程序。请参见:如何设计世界
基本思想是现代图形库高度事件驱动:您通过响应事件与外部世界交互。如果您足够仔细地观察它,universe库是MVC模型的实现:世界是“模型”,to-draw是“视图”,所有其他事件处理程序都是“控制器”。
如果您想在Racket中使用更低级别的元素,可以使用racket/gui库。这些库在Racket图形界面工具包中有参考文档。这里是一个使用该库的小例子:
#lang racket

(require racket/gui/base
         2htdp/image
         (only-in mrlib/image-core render-image))

;; The state of our program is a number.
(define state 0)

;; On a timer tick, increment the state, and refresh the canvas.
;; tick!: -> void
(define (tick!)
  (set! state (add1 state))
  (send THE-CANVAS refresh))


;; When a canvas paints itself, use the following:
;; paint: canvas% dc<%> -> void
(define (paint! a-canvas my-drawing-context)
  (define my-new-scene (text (format "I see: ~a" state) 20 'black))
  ;; Note: we force the canvas to be of a particular width and height here:
  (send a-canvas min-client-width (image-width my-new-scene))
  (send a-canvas min-client-height (image-height my-new-scene))
  (render-image my-new-scene my-drawing-context 0 0))


;; Here, we initialize our graphical application.  We create a window frame...
;; THE-FRAME: frame%
(define THE-FRAME (new (class frame%
                         (super-new)
                         ;; When we close the frame, shut down everything.
                         (define/augment (on-close)
                           (custodian-shutdown-all (current-custodian))))
                       [label "Example"]))


;; and add a canvas into it.
;; THE-CANVAS: canvas%
(define THE-CANVAS (new (class canvas%
                          (super-new)

                          ;; We define a key handler.  Let's have it so it
                          ;; resets the counter on a key press
                          (define/override (on-char key-event)
                            (when (eq? (send key-event get-key-code) 'release)
                              (set! state 0)
                              (send THE-CANVAS refresh))))
                        [parent THE-FRAME]
                        [paint-callback paint!]))

;; We get the frame to show on screen:
(send THE-FRAME show #t)

;; Finally, we set up a timer that will call tick! on every second.
(define THE-TIMER (new timer% 
                       [notify-callback tick!]
                       [interval 1000]))

这是一篇旧帖子,但是这个程序目前不起作用。错误是:模块:标识符已经从不同的源导入到: make-pen 2htdp/image。我无法纠正它。有人能够修复吗?还是语法和库已经发生了很大变化? - rnso
如何运行旧代码的示例可以在这里找到。 - Travis Hinkelman

2
最近一篇关于Common Lisp生态系统现状的文章说:如今使用CommonQtQtools是正确的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接