<bdo id='zkHON'></bdo><ul id='zkHON'></ul>

  • <i id='zkHON'><tr id='zkHON'><dt id='zkHON'><q id='zkHON'><span id='zkHON'><b id='zkHON'><form id='zkHON'><ins id='zkHON'></ins><ul id='zkHON'></ul><sub id='zkHON'></sub></form><legend id='zkHON'></legend><bdo id='zkHON'><pre id='zkHON'><center id='zkHON'></center></pre></bdo></b><th id='zkHON'></th></span></q></dt></tr></i><div id='zkHON'><tfoot id='zkHON'></tfoot><dl id='zkHON'><fieldset id='zkHON'></fieldset></dl></div>

    <small id='zkHON'></small><noframes id='zkHON'>

      <legend id='zkHON'><style id='zkHON'><dir id='zkHON'><q id='zkHON'></q></dir></style></legend>

      1. <tfoot id='zkHON'></tfoot>

        在 Kivy 中动态构建下拉菜单

        时间:2023-10-09
        • <bdo id='ESyTN'></bdo><ul id='ESyTN'></ul>

            <tbody id='ESyTN'></tbody>
        • <tfoot id='ESyTN'></tfoot>

            <small id='ESyTN'></small><noframes id='ESyTN'>

            <legend id='ESyTN'><style id='ESyTN'><dir id='ESyTN'><q id='ESyTN'></q></dir></style></legend>

            1. <i id='ESyTN'><tr id='ESyTN'><dt id='ESyTN'><q id='ESyTN'><span id='ESyTN'><b id='ESyTN'><form id='ESyTN'><ins id='ESyTN'></ins><ul id='ESyTN'></ul><sub id='ESyTN'></sub></form><legend id='ESyTN'></legend><bdo id='ESyTN'><pre id='ESyTN'><center id='ESyTN'></center></pre></bdo></b><th id='ESyTN'></th></span></q></dt></tr></i><div id='ESyTN'><tfoot id='ESyTN'></tfoot><dl id='ESyTN'><fieldset id='ESyTN'></fieldset></dl></div>
                  本文介绍了在 Kivy 中动态构建下拉菜单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我想根据类的字典属性在 kivy 中创建下拉列表.但是在循环中创建这些东西要么让 Kivy 感到困惑,要么让我感到困惑.这是我所拥有的:

                  I'd like to create dropdown-lists in kivy based on a dictionary property of a class. But something about creating these in a loop is either confusing Kivy or I am just confused. Here's what I have:

                  for main, ingrediants in self.ingrediants.items():
                      print main, ingrediants
                      dropdown = DropDown()
                  
                      for ingrediant in ingrediants:
                          btn = Button(text=ingrediant, size_hint_y=None, height=44)
                          btn.bind(on_release=lambda btn: dropdown.select(btn.text))
                          dropdown.add_widget(btn)
                  
                      trigger = Button(text=main, size_hint=(None, None))
                      trigger.bind(on_release=dropdown.open)
                      dropdown.bind(on_select=lambda instance, x: setattr(trigger, 'text', x))
                  
                      self.toolbar.dropdown_bar.add_widget(trigger)
                  

                  这是我的财产的样子:

                  ingrediants = DictProperty(
                      {
                          'Milk': ['Whole Milk', 'Soy', 'Creamer'],
                          'Coffee': ['Drip Coffee', 'Espresso', 'Pour Over'],
                          'Sugar': ['Sugar', 'Simple Syrup', 'Raw Sugar'],
                      }
                  )
                  

                  当这个渲染时,下拉栏看起来是正确的,三个按钮,但是,牛奶一个没有触发下拉目,咖啡一个触发它的下拉次,但选择时,改变糖按钮的文本,第三个按钮正常工作,触发下拉菜单并在选择时更改按钮文本.

                  When this renders, the dropdown bar looks correct, three buttons, BUT, the milk one does not trigger a dropdown, the coffee one triggers it's dropdown, but when selected, changes the sugar button's text, and the third button works normally, triggering a dropdown and changing the buttons text on selection.

                  我觉得我的循环做错了.但也许你不能像这样声明下拉菜单?谢谢.

                  I feel like I'm just doing something wrong with my loop. But maybe you can't declare dropdowns like this? Thanks.

                  这是我必须做的才能让它工作.

                  Here's what I had to do to get it working.

                  dropdowns = {}
                  for main, ingrediants in self.ingrediants.iteritems():
                      dropdowns[main] = DropDown()
                  
                      for ingrediant in ingrediants:
                          btn = Button(text=ingrediant, size_hint_y=None, height=44)
                          btn.bind(on_release=lambda btn=btn, dropdown=dropdowns[main]: dropdown.select(btn.text))
                          dropdowns[main].add_widget(btn)
                  
                      trigger = Button(text=main, size_hint=(None, 1))
                  
                      trigger.bind(on_release=dropdowns[main].open)
                      dropdowns[main].bind(on_select=lambda instance, x, trigger=trigger: setattr(trigger, 'text', x))
                      self.toolbar.dropdown_bar.add_widget(trigger)
                  

                  推荐答案

                  我很确定您的问题主要与 lambda 函数在 for 循环中的行为方式有关.例如,您可以查看 this 上一个问题以获取有关原因的信息 - 简短回答,每个 lambda接收相同的变量,所以只有那个变量(最后一个下拉菜单)做任何事情.

                  I'm pretty sure your problems are mostly to do with the way lambda functions behave in for loops. You can see for instance this previous question for information on why - short answer, every lambda receives the same variable, so only that variable (the last dropdown) does anything.

                  我没有时间创建一个工作示例(它很繁琐,而且您没有提供初始工作示例),但如果这还不足以让您修复问题.

                  I didn't have time to create a working example (it's fiddly, and you didn't provide an initial working example), but I'll try to make one later if this isn't enough for you to fix the issue.

                  我也遇到了下拉菜单不起作用的问题,但我认为这是因为您没有存储对它们的引用,因此它们会被垃圾收集.我添加了 dropdowns = ListProperty([])self.dropdowns.append(dropdown) 来保留引用,从而解决了它们不出现的问题.

                  I also had a problem with dropdowns not working, but I think that's because you don't store references to them so they get garbage collected. I added dropdowns = ListProperty([]) and self.dropdowns.append(dropdown) to keep references around, which solved the problem of them not appearing.

                  这篇关于在 Kivy 中动态构建下拉菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:Python kivy 入口点 inflateRest2 无法定位 libpng16-16.d 下一篇:通过 Kivy 按钮调用不同类中的函数

                  相关文章

                  最新文章

                      <legend id='9OBv4'><style id='9OBv4'><dir id='9OBv4'><q id='9OBv4'></q></dir></style></legend>
                        <bdo id='9OBv4'></bdo><ul id='9OBv4'></ul>

                    1. <small id='9OBv4'></small><noframes id='9OBv4'>

                      <i id='9OBv4'><tr id='9OBv4'><dt id='9OBv4'><q id='9OBv4'><span id='9OBv4'><b id='9OBv4'><form id='9OBv4'><ins id='9OBv4'></ins><ul id='9OBv4'></ul><sub id='9OBv4'></sub></form><legend id='9OBv4'></legend><bdo id='9OBv4'><pre id='9OBv4'><center id='9OBv4'></center></pre></bdo></b><th id='9OBv4'></th></span></q></dt></tr></i><div id='9OBv4'><tfoot id='9OBv4'></tfoot><dl id='9OBv4'><fieldset id='9OBv4'></fieldset></dl></div>
                      <tfoot id='9OBv4'></tfoot>