Как показать дочерний фрейм в обратном вызове (в блоке define) - PullRequest
0 голосов
/ 25 октября 2019

У меня есть два окна. Главное окно и окно справки. Я хочу, чтобы окно справки отображалось, когда пользователь нажимает кнопку.

(define help_window (new frame%
  [label "Help"]
  [parent main_window]
  [min-height 400] ;so window size is not 0
  [min-width 400])
)

(define (help)
  (send help_window show #true)) ; 

(define help_button (new button% [parent panel]
  [label "Help"]
  [callback (lambda (button event) help)] )
)

Моя проблема в том, что если я сделаю (define (help) (...)), то ничего не получится. Я нажимаю на кнопку, и она не отображается.

Я попытался (define help (...)), и определение выполняется до нажатия кнопки, и окно появляется за основным окном.

Ядаже не уверен, что я должен использовать лямбду. Там есть учебники, и я не смог заставить программу скомпилировать, вызвав любую другую функцию, кроме лямбды. Кроме того, без передачи (button event) в вызываемую функцию я даже не уверен, как будет определяться обратный вызов. На самом деле, я понятия не имею, что делает лямбда с (button event) или вызов функции делает с (button event).


Если я пытаюсь [callback help] с функцией (define (help) ... ), я получаю ошибку:

initialization for button%: contract violation
expected: (procedure-arity-includes/c 2)
given: #<procedure:syntax_help>

Если я попытаюсь [callback (help)] с функцией (define (help) ... ), я получу ошибку:

initialization for button%: contract violation
expected: (procedure-arity-includes/c 2)
given: #<void>

1 Ответ

1 голос
/ 25 октября 2019

Я ничего не знаю об этой инфраструктуре пользовательского интерфейса, но она выглядит так, как будто вы хотите, чтобы

(lambda (button event) (help))

help - это функция, поэтому, чтобы заставить ее делать все, что вам нужно, для ее вызова. Вы не можете просто использовать help в качестве обратного вызова, потому что это принимает нулевые аргументы, но обратные вызовы должны принимать два. Вот почему вы создали лямбду, которая принимает два аргумента (button и event), затем игнорирует их и вызывает help без аргументов.

...