或者创建 GUI 需要做的基本工作。我知道 GUI 的基本组件,但是从哪里开始。我只是一个自学的人,我正在阅读本书末尾的“如何设计程序”(HtDP),作者建议要成为一名程序员,需要具备GUI和CGI计算机网络的知识。最后两个的信息很容易找到。但似乎很少有书谈论如何创建 GUI。我想也许它在设计很少有人关心的计算机程序的过程中太“低”了。
问问题
10408 次
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 生态系统现状的文章说:CommonQt加Qtools是当今的发展方向。
于 2015-08-30T18:50:36.893 回答