我不知道如何在Racket上实现用户界面



在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)

(抱歉,如果有多余的括号)。问题是,当程序在两个面板的主窗口中启动时,但只有在开关丢失后,其中一个才单独启动。我在哪里直言不讳?如果你能给出一个更正或一个工作示例,我将不胜感激(但请用"头"的决定,因为直到非常了解球拍,我都无法理解,或多或少都很复杂)。提前谢谢!

Racket语言理解中的错误

你的代码中有更多的错误,而不仅仅是"额外的括号"。你的示例代码对我来说根本无法运行,这表明你对Racket本身没有足够的基本熟练程度,无法在开发GUI方面取得非常有效的进展

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

define表单不能以这种方式形成;在Racket(或Scheme)中说是没有意义的

(define N A B)

如果CCD_ 2仅仅是一个标识符。

开发方法论中的错误

您应该在DrRacket中开发您的代码;这将帮助您更正代码中的许多错误。由于您的代码顶部有一个#lang指令,您应该能够立即在DrRacket中开始。

DrRacket很容易发现的另一个错误示例:拼写错误的标识符my-settibgs-hash

至于如何实现选项卡的实际问题,正如您所问的,您应该阅读tab-panel%类本身的文档。DrRacket有一个集成的帮助台,因此您可以右键单击像tab-panel%这样的标识符,提供的菜单选项之一是"从rack/gui/base,rack/gui查看选项卡面板%的文档";单击该按钮将转到该类的文档网页的本地副本。

选项卡面板%界面的使用错误

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

固定代码示例

这是我对你的代码的修改版本,是从我正在运行的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)

相关内容

  • 没有找到相关文章

最新更新