【问题标题】:How to make a GUI using Lisp: DrScheme or Common Lisp如何使用 Lisp 制作 GUI:DrScheme 或 Common Lisp
【发布时间】:2012-01-14 04:35:20
【问题描述】:

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

【问题讨论】:

  • 网页也是GUI。

标签: user-interface lisp racket htdp


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    • 如果你只想在 Common Lisp 中制作简单的 GUI,你最好 在我看来,选择是 LTK,它是一个高级接口 Tcl/Tk 脚本库
    • 还有很多其他选择,但它们需要一些 你正在努力实现的愿景。如果你想使用 广泛使用的 GUI 工具包(GTK 或 Qt)之一有 CL-GTK2 和CommonQt。但是你首先要明白,这些 工具包工作
    • LispWorks 提供了一个非常复杂的 GUI 构建器库 CAPI, 这是跨平台的
    • 在 Mac 上 ClozureCL 有很好的Cocoa bindings
    • 终于有了一个成熟的 GUI 原生 CL 解决方案 - McCLIM - 这是非常灵活的,但相当复杂

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

    【讨论】:

    • Clozure CL 在 Windows 上也有 Cocoa 绑定。使用 Cocotron。
    【解决方案3】:

    有一个轻量级的库,用于通过 2htdp/universe 编写简单的图形程序。请参阅:How to Design Worlds

    基本思想是现代图形库是高度事件驱动的:您通过响应事件与外部世界进行交互。如果你仔细观察,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]))
    

    【讨论】:

    • 这是一篇旧帖子,但该程序目前无法运行。错误是:模块:标识符已从不同来源导入:make-pen 2htdp/image。我无法纠正它。这可以由某人纠正吗?或者语法和库现在已经发生了很大变化?
    • here 中找到了如何运行此旧代码的示例。
    【解决方案4】:

    最近的article on the current state of the Common Lisp ecosystem 说:CommonQt 加上Qtools 是当今要走的路。

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2017-06-08
      • 2020-07-17
      相关资源
      最近更新 更多