一旦用户点击其中几个按钮,并为用户提供一个新的按钮列表,就可以隐藏所有按钮

时间:2017-04-23 18:57:10

标签: user-interface button racket

我正在尝试编写一个程序,我希望用户点击我给他们的3个选项中的一些选项然后在其中两个被点击之后我希望程序隐藏所有选项并给出它们是用户可以单击的新选项(按钮)列表。这就是我的代码:

(define frame (new frame% [label "Choices in life"]
                   [width 460]
                   [height 460]))

(define canvas (new canvas% [parent frame]
                    [paint-callback
                     (lambda (canvas dc)
                       (send dc set-scale 3 3)
                       (send dc set-text-foreground red)
                       (send dc draw-text "The choice is yours" 19 30)
                       (send canvas set-canvas-background "black"))]))

消息告诉您选择三个选项中的两个

(define search-company-msg (new message%
                                [label "Pick two of three:"]
                                [parent frame]
                                ))

一个应隐藏按钮的功能(我希望它在用户从3个选项中选出2个后立即隐藏所有按钮。我知道它没有正确实现,但这只是我的想法:

(define hide-choice-1-2-3
  (lambda (button event)
    (send button style '(deleted))))

#choice 1

    (define choice-1
      (new button%
           [parent frame]
           [label "choice-1"]
           [min-width 200]
           [min-height 10]
           [callback (lambda (button event)
                (send button enable #f)
                       )]
           ))
#choice 2

(define choice-2
      (new button%
           [parent frame]
           [label "choice-1"]
           [min-width 200]
           [min-height 10]
           [callback (lambda (button event)
                (send button enable #f)
                       )]
           ))
#choice 3

(define choice-3
      (new button%
           [parent frame]
           [label "choice-1"]
           [min-width 200]
           [min-height 10]
           [callback (lambda (button event)
                (send button enable #f)
                       )]
           ))

这些是我想要在选择了两个选项并且旧选择消失之后出现的新选择:

(define choice-4
          (new button%
               [parent frame]
               [label "choice-1"]
               [min-width 200]
               [min-height 10]
               [callback (lambda (button event)
                    (send button enable #f)
                           )]
               ))

(define choice-5
          (new button%
               [parent frame]
               [label "choice-1"]
               [min-width 200]
               [min-height 10]
               [callback (lambda (button event)
                    (send button enable #f)
                           )]
               ))

显示框架

(send frame show #t)

我知道[style '(deleted)]会隐藏按钮但我不知道如何使用它来隐藏所有按钮,只有几个按钮被选中。我的另一个问题是通过更换旧按钮使新按钮出现在框架中。我知道文档中有add-child method,但我不知道如何使用它。有人可以用代码帮我。

1 个答案:

答案 0 :(得分:0)

我不清楚你的总体目标是什么,我不想做出一堆假设,但你要找的是实现{{delete-child类的方法。 1}}接口。样式area-container<%>用于使容器在其创建时不可见或由容器管理;否则,你不直接处理它。无论如何,只需添加新按钮就可以显示它们。例如:

'deleted

根据您的目标,您可能需要更明确地管理儿童。为此,您可以在实例化按钮上使用#lang racket/gui (define main-frame (new frame% (label "Main Frame"))) (define button-V (new vertical-panel% (parent main-frame))) (define make-button (let ((used-index 0)) (λ() (define b (new button% (parent button-V) (label (format "Button ~a" used-index)) (callback (λ(b e) (send button-V delete-child b) (make-button))))) (set! used-index (add1 used-index)) b))) (for ((i (in-range 3))) (make-button)) (send main-frame show #t) 样式,然后确定要通过'deletedadd-child显示哪些按钮,例如

change-children

编辑: 我有一个完整的例子。对不起,我花了很长时间跟进了我的承诺,但我不确定找到一个合理简短且相当清楚的例子。我不知道我是否达到了这个目标。

主要策略是1)制作一个选项列表列表2)索引它们3)将它们传递给一个过程,该过程通过消耗列表中的第一组选项来生成按钮4)那些按钮然后可以调用相同的过程在(3)中与剩余的选择列表列表。作为额外的奖励,我使程序能够循环并记录所做的选择。

我没有声称这是一个很好的方法,但这是我遇到的解决方案。你的问题的主要问题是真的取决于你想要做什么选择,因为回答这样的问题几乎肯定会对各种数据结构产生影响。

(define B
    (new button%
         (parent button-V)
         (label "Mystery")
         (style '(deleted))))
; later... 
(send button-V add-child B)