我不明白如何在Racket上实现用户界面

1 user-interface scheme 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)
Run Code Online (Sandbox Code Playgroud)

(对不起,如果有额外的括号).这是问题所在 - 当程序在两个面板的主窗口中启动时,但只有在交换机丢失后才会出现,而且只有一个单独处理.我直言不讳?如果你能给出一个更正或一个工作的例子,我将不胜感激(但请以"头"的决定,因为直到非常了解球拍,我无法理解,或多或少复杂).先感谢您!

pnk*_*lix 7

理解Racket语言的错误

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

 (define my-settings-hash "label" "Test")`
Run Code Online (Sandbox Code Playgroud)

define形式不能形成这种方式; 在Racket(或Scheme)中没有意义

(define N A B)
Run Code Online (Sandbox Code Playgroud)

if N仅仅是一个标识符.

发展方法论的误区

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

DrRacket容易捕获的错误的另一个例子:拼写错误的标识符my-settibgs-hash.

至于你如何实现标签的实际问题,正如你的要求,你应该阅读tab-panel%类本身的文档.DrRacket有一个集成的帮助台,因此您可以右键单击标识符tab-panel%,其中一个菜单选项是"查看文档,用于选项卡面板%来自racket/gui/base,racket/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)
Run Code Online (Sandbox Code Playgroud)