Как получить метку кнопки в Racket / PLT-Scheme? - PullRequest
0 голосов
/ 06 января 2011

Я пытаюсь выполнить упражнение 22.3.3 из 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 Ответ

3 голосов
/ 06 января 2011

Правильно.Функция draw-message использует «окно» и «строку», что описано на рисунке 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)))))

Посмотрите, как эхо-сообщение меняет отображение, когда вы нажимаете кнопку «Копировать сейчас».

Подсказка: поскольку у вас есть один обратный вызов на кнопку, вы точно знаете, какую строку отправить на дисплей, с какой кнопки обратный вызов.

Исправление: Пример 1 в книге не работает.Вместо этого используйте

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

.

...