如何在Racket / PLT-Scheme中检索按钮的标签?

时间:2011-01-06 06:28:57

标签: user-interface scheme racket

我正在尝试Exercise 22.3.3 from HtDP,但不知道如何检索点击按钮的标签。我收到此消息draw-message: expected <string> as second argument, given: (instantiate (class ...) ...)这似乎暗示我需要一个字符串,但我得到一个类的实例。回调中的答案是什么?如果是这样,我该如何解构呢?


这是我到目前为止所做的:

(define pad1
  '((1 2 3)
    (4 5 6)
    (7 8 9)
    (\# 0 *)))

(define pad2 
  '((1 2 3  +)
    (4 5 6  -)
    (7 8 9  *)
    (0 = \. /)))

(define (title t)
  (make-message t))

(define display
  (make-message ""))

(define (pad->gui p)
  (cond
    [(empty? p) empty]
    [else (cons (button-maker (first p))
                (pad->gui (rest p)))]))

;; make buttons out of a list
(define (button-maker a-list)
  (cond
    [(empty? a-list) empty]
    [(number? (first a-list))(cons (make-button (number->string (first a-list)) call-back)
                                   (button-maker (rest a-list)))]
    [(symbol? (first a-list))(cons (make-button (symbol->string (first a-list)) call-back)
                                   (button-maker (rest a-list)))]))

(define (call-back b)
  (draw-message display ...))


(create-window
 (append (list (list (title "Virtual Phone")))
         (list (list display))
         (pad->gui pad1)))

如果我理解正确,按下时每个按钮都会调用call-back。这反过来应该调用display来更新文本。但是,我不明白如何检索调用者的标签。例如如果按下“9”按钮,它将调用call-back。但是如何检索值“9”?这是我不确定的。

1 个答案:

答案 0 :(得分:3)

正确。 draw-message函数使用'window'和'string',这在同一节中的图62中有记录。您似乎将它应用于“按钮对象”。另请参见同一部分中的示例2,如下所示:

(define a-text-field
  (make-text "Enter Text:"))

(define a-message
  (make-message "`Hello World' is a silly program."))

(define (echo-message e)
  (draw-message a-message (text-contents a-text-field)))

(define w (create-window
           (list (list a-text-field a-message)
                 (list (make-button "Copy Now" echo-message)))))

当您单击“立即复制”按钮时,查看echo-messsage如何更改显示。

提示:由于每个按钮有一个回调,因此您确切地知道要从哪个按钮回调发送到显示器的字符串。

更正:本书中的示例1已被破坏。使用

 (define u
  (create-window (list (list (make-button "Close" (lambda (x) (hide-window u)))))))

代替。