または、GUI を作成するために必要な基本的な作業。GUI の基本的なコンポーネントは知っていますが、どこから始めればよいでしょうか。私はただの独学者で、本の最後にある「プログラムの設計方法」(HtDP) を読んでいますが、著者は、プログラマーになるには GUI と CGI コンピューター ネットワークの知識が必要であると示唆しています。最後の 2 つの情報は簡単に見つけることができます。しかし、GUI の作成方法について説明している本はほとんどないようです。おそらく、コンピューター プログラムを設計するプロセスでは、ほとんどの人が気にしないほど「低すぎる」と思います。
4 に答える
DrRacket (DrScheme の現在のバージョンの名前) での GUI プログラミングのドキュメントは、こちら: http://docs.racket-lang.org/gui/index.html
あなたは HTDP を読んでいるので、おそらくこれが今のあなたにとって最良の選択肢です。
- Common Lisp で単純な GUI を作成したいだけの場合、私の意見では、Tcl/Tk スクリプト ライブラリへの高レベル インターフェイスである LTK が最良の選択です。
- 他にもたくさんの選択肢がありますが、達成しようとしていることについてある程度のビジョンが必要です。広く普及している GUI ツールキット (GTK または Qt) のいずれかを使用する場合は、CL-GTK2 と CommonQt があります。しかし、まず第一に、これらのツールキットがどのように機能するかをよく理解する必要があります
- LispWorks は、クロスプラットフォームである非常に洗練された GUI ビルダー ライブラリ CAPI を提供します。
- Mac ClozureCL には優れたCocoa バインディングがあります
- 最後に、GUI 用の本格的なネイティブ CL ソリューションである McCLIM があります。これは非常に柔軟ですが、かなり複雑です。
また、GUI を理解し、理論的な観点から研究したい場合は、MVC、Model2、MVVM などのさまざまな GUI パターンについて学ぶ必要があります。みたいなパターンなので、そういう企画をやってみると面白い勉強になるかも…。
2htdp/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]))