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)

(对不起,如果有额外的括号)。这就是问题所在 - 当程序在两个面板的主窗口中启动时,但只有在开关丢失后,一个单独存在。我哪里钝了?如果您能给出更正或工作示例,我将不胜感激(但请以“头”的决定为准,因为直到非常了解球拍并且我无法理解,或多或少复杂)。先感谢您!

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 很容易发现的另一个错误示例:拼写错误的标识符my-settibgs-hash

至于如何实现选项卡的实际问题,正如您所问的,您应该阅读tab-panel%该类本身的文档。DrRacket 有一个集成的帮助台,因此您可以右键单击类似的标识符tab-panel%,提供的菜单选项之一是“查看来自球拍/gui/base、球拍/gui 的选项卡面板% 的文档”;单击该按钮会将您带到该课程的文档网页的本地副本。

tab-panel%界面的使用误区

阅读文档后tab-panel%,请特别注意tab-panel%没有label参数,至少在 5.3.2 版本中没有(这是新的,但我怀疑这个接口在一段时间内没有显着变化)。我不知道您要在那里做什么,但我怀疑您正试图让某种文本显示在面板内。在 Racket 中创建文本有几个不同的选项;最简单的可能是message%。(不过,我建议浏览整个小部件库,因为其他小部件可能更符合您的需求。)

示例固定代码

这是我修改后的代码,从我正在运行的 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 回答