13

或者创建 GUI 需要做的基本工作。我知道 GUI 的基本组件,但是从哪里开始。我只是一个自学的人,我正在阅读本书末尾的“如何设计程序”(HtDP),作者建议要成为一名程序员,需要具备GUI和CGI计算机网络的知识。最后两个的信息很容易找到。但似乎很少有书谈论如何创建 GUI。我想也许它在设计很少有人关心的计算机程序的过程中太“低”了。

4

4 回答 4

11

DrRacket 中的 GUI 编程文档(当前版本 DrScheme 的名称)在这里:http ://docs.racket-lang.org/gui/index.html

由于您正在阅读 HTDP,因此这可能是您目前的最佳选择。

于 2011-12-06T15:31:45.460 回答
9
  • 如果您只想在 Common Lisp 中制作简单的 GUI,在我看来,您最好的选择是 LTK,它是 Tcl/Tk 脚本库的高级接口
  • 还有很多其他选择,但它们需要对您要实现的目标有所了解。如果您想使用其中一种广泛使用的 GUI 工具包(GTK 或 Qt),则有 CL-GTK2 和 CommonQt。但是你首先要了解这些工具包是如何工作的
  • LispWorks 提供了一个非常复杂的 GUI 构建器库 CAPI,它是跨平台的
  • 在 Mac 上 ClozureCL 具有良好的Cocoa 绑定
  • 最后,有一个成熟的 GUI 原生 CL 解决方案 - McCLIM - 它非常灵活,但非常复杂

另外,如果你想了解 GUI 并从理论角度研究它,你应该了解各种 GUI 模式,例如 MVC、Model2、MVVM 等。我不知道 Lisp 中的任何 GUI 框架,实现这样的模式,所以做这样的项目可能是一次有趣的学习经历……

于 2011-12-06T20:20:16.860 回答
8

有一个轻量级的库,用于通过 2htdp/universe 编写简单的图形程序。请参阅:如何设计世界

基本思想是现代图形库是高度事件驱动的:您通过响应事件与外部世界进行交互。如果你仔细观察,Universe 库是 MVC 模型的实现:世界是“模型”,要绘制的是“视图”,所有其他事件处理程序都是“控制器”。

如果你想在 Racket 中使用更多的低级元素,你可以使用 racket/gui 库。这些在The Racket Graphical Interface Toolkit中有参考文档。这是一个使用该库的小示例:

#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]))
于 2011-12-11T22:59:27.220 回答
2

最近一篇关于 Common Lisp 生态系统现状的文章说:CommonQtQtools是当今的发展方向。

于 2015-08-30T18:50:36.893 回答