1

Racket で GUI を選択し始め、すぐにタブを挿入しました。それが突き合わされた場所です(コードを求めて、欠点を見つけることはあまりありません。Racketを学び始めたばかりです):

#lang racket/gui 
(define my-settings-hash (make-hash))
(define my-settings-hash "label" "Test")
(define my-settings-hash "width" 300)
(define my-settings-hash "height" 300)
(define my-tabs-list (list "Tab 0"
                           "Tab 1"
                           "Tab 2"))
(define root-wnd (new frame% [label (hash-ref my-settibgs-hash "label")]
                             [width (hash-ref my-settings-hash "width")]
                             [height (hash-ref my-settings-hash "height"]))
(define tab-panel (new tab-panel%
                             (parent root-wnd)
                             (choices my-tabs-list)
                             (callback
                               (lambda (tp e)
                                (case (send tp get-selection)
                                 ((0) (send tp change-children (lambda (children) (list a-panel))))
                                 ((1) (send tp change-children (lambda (children) (list b-panel))))
                                 ((2) (send tp change-children (lambda (children) (list a-panel)))))))))
(define a-panel (new panel%
                 (parent tab-panel)
                 (label "A-panel")))
(define b-panel (new panel%
                 (parent tab-panel)
                  (label "b-panel")))
(send frame show #t)

(余分なブラケットがある場合は申し訳ありません)。ここに問題があります - プログラムが 2 つのパネルのメイン ウィンドウで開始されたときですが、スイッチが失われ、1 つだけが残った後でのみです。どこで鈍くする?修正または実際の例を教えていただければ幸いです(ただし、ラケットを非常によく知らず、多かれ少なかれ複雑になるまで理解できないため、「頭」の決定をお願いします)。前もって感謝します!

4

1 に答える 1

7

Racket 言語の理解の誤り

コードには、「余分な括弧」以外にも多くの間違いがあります。私にとってはまったく実行されないサンプル コードは、Racket 自体で GUI の開発作業を非常に効率的に進めるのに十分な基本的な習熟度がないことを示しています。そのような間違いの例は、次の行です。

 (define my-settings-hash "label" "Test")`

このdefineようにフォームを形成することはできません。Racket(またはScheme)で言うのは意味がありません

(define N A B)

ifNは単なる識別子です。

開発方法論の間違い

DrRacket でコードを開発する必要があります。これは、コードで犯した多くのエラーを修正するのに役立ちます。コードの先頭にディレクティブがあるため#lang、DrRacket 自体ですぐに開始できるはずです。

DrRacket が簡単に見つけられる間違いのもう 1 つの例は、スペルの誤りである identifiermy-settibgs-hashです。

タブの実装方法に関する実際の質問については、質問したように、tab-panel%クラス自体のドキュメントを読む必要があります。DrRacket には統合されたヘルプ デスクがあるため、次のような識別子を右クリックすると、tab-panel%提供されるメニュー オプションの 1 つに「racket/gui/base、racket/gui から tab-panel% のドキュメントを表示する」があります。クリックすると、そのクラスのドキュメント Web ページのローカル コピーに移動します。

tab-panel% インターフェイスの使用上の誤り

のドキュメントを読んだ後、特に には引数がないことtab-panel%に注意してください。少なくともバージョン 5.3.2 ではそうではありません (これは新しいですが、このインターフェイスはしばらく大幅に変更されていないと思います)。そこで何をしようとしているのかはわかりませんが、パネル内に何らかのテキストを表示しようとしていると思われます。Racket でテキストを作成するには、いくつかの異なるオプションがあります。最も単純なものはおそらく. (ただし、ウィジェット ギャラリー全体を参照することをお勧めします。他のウィジェットの方が、必要なものにより適している可能性があるためです。)tab-panel%labelmessage%

固定コードの例

これは、実行中の DrRacket からカットアンドペーストしたコードの改訂版です。私はできる限りあなたの元のコードに忠実であり続けるように努めました (転写に存在する基本的な間違いを考えると、どこかから転写したに違いないと思います。その元のソース)。

#lang racket/gui 

(define my-settings-hash (make-hash))
(hash-set! my-settings-hash "label" "Test")
(hash-set! my-settings-hash "width" 300)
(hash-set! my-settings-hash "height" 300)
(define my-tabs-list (list "Tab 0"
                           "Tab 1"
                           "Tab 2"))
(define root-wnd (new frame% [label (hash-ref my-settings-hash "label")]
                             [width (hash-ref my-settings-hash "width")]
                             [height (hash-ref my-settings-hash "height")]))
(define tab-panel (new tab-panel%
                             (parent root-wnd)
                             (choices my-tabs-list)
                             (callback
                               (lambda (tp e)
                                (case (send tp get-selection)
                                 ((0) (send tp change-children (lambda (children) (list a-panel))))
                                 ((1) (send tp change-children (lambda (children) (list b-panel))))
                                 ((2) (send tp change-children (lambda (children)
                                                                 (list a-panel)))))))))
(define a-panel (new panel% (parent tab-panel)))
(define a-text (new message% (parent a-panel) (label "A-panel")))
(define b-panel (new panel% (parent tab-panel)))
(define b-text (new message% (parent b-panel) (label "b-panel")))

(send root-wnd show #t)
于 2013-02-12T09:10:35.873 に答える