【问题标题】:Adding custom Buttons Dynamically Kivy动态添加自定义按钮 Kivy
【发布时间】:2020-01-20 13:05:41
【问题描述】:

我想根据一些列表动态地在 floatlayaout 中创建自定义按钮。我怎样才能从这里前进?

from kivy.uix.button import ButtonBehavior
from kivy.uix.image import Image

class Home(ScreenManager):
    pass

class FirstSc(Screen):
    pass

class ImBut(ButtonBehavior, Image):
    pass

class SecSc(Screen):
    pass

class Category(Screen):
    pass

customButton 是我在 kivy 的根小部件中创建的,并希望根据我在“SecSc”屏幕浮动布局中提供的列表动态填充它。如何访问自定义按钮并将其添加到“SecSc”类?

root_widget = Builder.load_string('''
Home:
    FirstSc:
    SecSc:
    Category:
`THIS IS THE CUSTOM BUTTON`
<customButton@Button>
    id: custbut
    font_size: 0.65 * self.height
    size_hint: (.15,.1)
    border_radius: [18]
    canvas.before:
        Color:
            rgba: self.back_color
        RoundedRectangle:
            size: self.size
            pos: self.pos
            radius: self.border_radius

<FirstSc>:
    name: '1st'
    FloatLayout:
        canvas.before:
            Rectangle:
                source: 'bg.png'

<SecSc>:
    name: '2nd'
    FloatLayout:
        canvas.before:
            Rectangle:
                source: 'bg.png'
        FloatLayout:
            id: grid
            `HERE I WOULD LIKE TO ADD BUTTONS`
<Category>:
    name: 'category'

''')

class MyiApp(App):
    def build(self):
        return root_widget

MyiApp().run()

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    也许这可以帮助您入门。修改你的SecSc 类:

    class SecSc(Screen):
        def on_enter(self, *args):
            count = 0
            for txt in ["Abba", "Dabba", "Doo"]:
                butt = Factory.CustomButton(text=txt, pos=(50, count*75))
                self.ids.grid.add_widget(butt)
                count += 1
    

    on_enter() 的使用只是一个示例。关键是使用Factory 创建一个仅在kv 中定义的Widget。

    【讨论】:

    • 这行得通。现在有什么方法可以访问这些按钮吗?我尝试为他们分配 id,但它不起作用。
    • 您只能在kv 文件或字符串中分配ids。如果您需要保留对这些 Buttons 的引用,则必须构建自己的字典或它们的列表。
    【解决方案2】:

    谢谢。让它工作。 这是它的外观 -

        def on_enter(self, *args):
            count = 0
           ab = ["A", "D", "D"]
            self.buttons = []
            for i,j in enumerate(ab):
                self.buttons.append(Factory.ImButb(text=j, on_press=self.o_p))
                self.ids.grid.add_widget(self.buttons[i])
                count += 1
            print(self.buttons)
        def o_p(self, instance):
            print(str(instance.text))
    

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      相关资源
      最近更新 更多