从 clojure/跷跷板中的按钮返回信息



我还有一个问题。

所以我目前正在做一个项目,并试图为它编写一个 GUI 组件。我有所有的功能部件在工作,所以现在我只想让它看起来也不错,并更多地了解跷跷板的工作原理。

基本上,我有一堆输入字段(即文本字段,滑块,组合框),用户可以使用这些字段来输入某些类型的数据。当用户单击"确认"按钮时,我希望按钮的操作返回上述输入字段的所有值。我对线程没有太多经验,但了解(显然)可能存在一些并发问题。我怎样才能做到这一点?

作为参考,下面是我的代码的一小部分示例:

    ;
    ;in restaurant-gui.core
    ;
    (defn window-setup []
      (let [my-font        (font :name "Arial"
                                 :size 22)
           cuisine-label   (label    :text "Cuisine: "
                                     :font my-font
                                     :border [20 10])
           cuisine         (combobox :model["Any cuisine"
                                            "American"
                                            "Barbecue"
                                            "Chinese"
                                            "French"
                                            "Italian"])
           confirm-button  (button   :text "Confirm"
                                     :listen [:action (fn [event] event 
                           (selection cuisine))])
           window-contents (vertical-panel :items [cuisine-label cuisine 
                            confirm-button])]
           window-contents))
    ;     
    ;in restaurant-inference-engine.core
    ;
    (defn -main
      [&args]
      (binding [window-contents (window-setup)]
        (draw-window window-contents)     ;somehow listen here for
                                          ;information from the button
                                          ;and bind it to button-info?...
        (search-for-restaurant button-info)))

另外,如果有人知道我可以查看的任何简单到中级的 clojure 代码,我将不胜感激。我想更多地接触编写良好的 clojure 代码,以提高我对语言的理解。

当使用像GUI这样固有的状态时,转向Clojure的可变状态功能通常是有帮助的。我看到了两种基本方法:

  • 将每个 UI 元素的状态存储在ref中,然后将相关 ref 传递到需要处理 UI 状态的函数中。
  • 将 GUI 的状态存储在一个atom中,并将该原子传递给使用任何 UI 组件的每个函数,以便它们始终可以随时使用 UI 的当前状态。请注意以一致的方式更新它。
  • 使用 Core.async 让 UI 事件将消息发送到需要它们的组件。在我看来,这允许使用干净的代码进行非常响应的 UI,尽管您必须完成设置 chans 的工作。

这些中的任何一个似乎都不太可能适用于所有甚至大多数项目,因此它对您的特定项目的外观有一些影响。如果您坚持使用官方的 Clojure 方法来处理不断变化的状态(atoms、vars、refs、agents、chans),您可能不需要担心"并发"问题。

相关内容

  • 没有找到相关文章

最新更新