【问题标题】:kivy dynamically add custom widget to layout via pythonkivy通过python动态添加自定义小部件到布局
【发布时间】:2015-02-18 07:00:46
【问题描述】:

我能够让我的布局使用静态 kivy 语言,但我需要能够通过 python 将项目添加到我的列表中。我已经尝试了几件事,但似乎无法让任何东西正常工作。这是我静态工作的内容。

main.py

#!/usr/bin/python

import os
import kivy
kivy.require('1.8.0')

from kivy.app import App
from kivy.core.window import Window
from kivy.logger import Logger

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class CustomButton(Button):
    pass

    def click(button):
        Logger.info(button.title + ": wid=" + button.wid)


class SelectFruit(App, BoxLayout):
    icon = 'ico/fruit.png'
    title = 'Awesome Fruit Picker'

    def build(self):
        Window.size = 400, (4 * 78)     
        return SelectFruit()

if __name__ in ('__main__'):
    SelectFruit().run()

选择水果.kv

#:kivy 1.8.0

<CustomButton@Button>:
    wid: ""
    image: ''
    title: ''
    label: ''
    on_press: self.click()
    BoxLayout:
        orientation: "horizontal"
        size: self.parent.size      # match the button's size
        pos: self.parent.pos        # match the button's position
        padding: 5   
        spacing: 10

        Image:
            size_hint: None, 1
            source: root.image
            size: 64, 64
            valign: "middle"


        Label:
            size_hint: None, 1
            text: root.label
            valign: "middle"
            size: 400, 64
            text_size: self.size


<SelectFruit>
    orientation: "vertical"
    padding: 2

    CustomButton:
        wid: "0"
        image: "ico/apple.png"
        title: "apple"
        label: "Apple: Super Sweet\nPicked On: 12/26/2014, 2:01 PM"

    CustomButton:
        wid: "1"
        image: "ico/banana.png"
        title: "banana"
        label: "Banana: Want a bunch?\nPicked On: 2/18/2014, 2:01 PM"

    CustomButton:
        wid: "2"
        image: "ico/strawberry.png"
        title: "strawberry"
        label: "Strawberry: Yummy Yummy\nPicked On: 5/6/2014, 2:01 PM"

    CustomButton:
        wid: "3"
        image: "ico/orange.png"
        title: "orange"
        label: "Orange: Florida's Best\nPicked On: 4/21/2014, 2:01 PM"

我只需要能够以编程方式将每个 CustomButton 添加到我的布局中,而不是通过 kivy 语言文件。 非常感谢任何帮助。

【问题讨论】:

    标签: python dynamic widget kivy


    【解决方案1】:

    这里的工作代码显示了一些以 kivy 语言添加的项目,然后以编程方式添加了一些附加项目。我还添加了 ScrollView,这是一个配置设置以防止窗口被调整大小和代码以突出显示选定的项目。

    我希望这对将来的某人有所帮助。 :)

    main.py

    #!/usr/bin/python
    
    from kivy.config import Config
    Config.set('graphics','resizable',0)
    
    import kivy
    kivy.require('1.8.0')
    
    from kivy.app import App
    from kivy.core.window import Window
    from kivy.properties import ObjectProperty, StringProperty
    from kivy.logger import Logger
    
    from kivy.uix.scrollview import ScrollView
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.button import Button
    
    
    class ButtonListItem(Button):
        wid = StringProperty('')
        image = StringProperty('')
        title = StringProperty('')
        label = StringProperty('')
        pass
    
        def click(button):
            global app
            app.clearSelection()
            button.background_color = (0,160,66,.9)
            Logger.info(button.title + ": wid=" + button.wid)
    
    class ButtonList(GridLayout):
        pass
    
    class SelectFruit(App):
        icon = 'ico/fruit.png'
        title = 'Awesome Fruit Picker'
    
        def build(self):
            Window.size = 400, (4 * 90)
    
            self.layout = ButtonList()
            self.layout.size = 400, (8 * 78)
    
            self.root = ScrollView(
                            size_hint=(None, None), 
                            size=Window.size,
                            scroll_type=['bars', 'content']
                        )
            self.root.add_widget(self.layout)
    
            ib = ButtonListItem(
                    wid="0", 
                    image="ico/apple.png", 
                    title="apple", 
                    label="Apple: Super Sweet\nPicked On: 12/26/2014, 2:01 PM"
                )
            self.layout.add_widget(ib)
    
            ib = ButtonListItem(
                    wid="1", 
                    image="ico/banana.png", 
                    title="banana", 
                    label="Banana: Want a bunch?\nPicked On: 2/18/2014, 2:01 PM"
                )
            self.layout.add_widget(ib)
    
            ib = ButtonListItem(
                    wid="2", 
                    image="ico/strawberry.png", 
                    title="strawberry", 
                    label="Strawberry: Yummy Yummy\nPicked On: 5/6/2014, 2:01 PM"
                )
            self.layout.add_widget(ib)
    
            ib = ButtonListItem(
                    wid="3", 
                    image="ico/orange.png", 
                    title="orange", 
                    label="Orange: Florida's Best\nPicked On: 4/21/2014, 2:01 PM"
                )
            self.layout.add_widget(ib)
    
            return self.root
    
        def clearSelection(self):
            for child in self.layout.children:
                child.background_color = (1,1,1,1)
    
    if __name__ == "__main__":
        app = SelectFruit()
        app.run()
    

    选择水果.kv

    #:kivy 1.8.0
    
    <ButtonListItem@Button>:
        wid: self.wid
        image: self.image
        title: self.title
        label: self.label
        on_press: self.click()
        BoxLayout:
            orientation: "horizontal"
            size: self.parent.size      # match the button's size
            pos: self.parent.pos        # match the button's position
            padding: 5   
            spacing: 10
    
            Image:
                size_hint: None, 1
                source: root.image
                size: 64, 64
                valign: "middle"
    
    
            Label:
                size_hint: None, 1
                text: root.label
                valign: "middle"
                size: 400, 64
                text_size: self.size
    
    
    <ButtonList@GridLayout>
        id: output
        cols: 1
        size_hint_y: None
        height: self.minimum_height
    
        ButtonListItem:
            wid: "0"
            image: "ico/apple.png"
            title: "xapple"
            label: "Apple: Super Sweet\nPicked On: 12/26/2014, 2:01 PM"
    
        ButtonListItem:
            wid: "1"
            image: "ico/banana.png"
            title: "xbanana"
            label: "Banana: Want a bunch?\nPicked On: 2/18/2014, 2:01 PM"
    
        ButtonListItem:
            wid: "2"
            image: "ico/strawberry.png"
            title: "xstrawberry"
            label: "Strawberry: Yummy Yummy\nPicked On: 5/6/2014, 2:01 PM"
    
        ButtonListItem:
            wid: "3"
            image: "ico/orange.png"
            title: "xorange"
            label: "Orange: Florida's Best\nPicked On: 4/21/2014, 2:01 PM"
    

    【讨论】:

      【解决方案2】:
      def click(button):
      

      调用方法self的第一个参数是正常的,引用其方法被调用的实例。

      class SelectFruit(App, BoxLayout):
      

      这似乎是一个灾难的秘诀,没有必要让应用程序也成为一个小部件,它有可能出现奇怪的错误,因为这意味着你将同时运行两个应用程序。您应该将其分成单独的小部件和应用程序类。

      我需要能够通过 python 将项目添加到我的列表中

      我不清楚这到底是哪一部分是问题,但您应该能够使用App.get_running_app().root.add_widget(your_widget) 添加到(例如)根小部件,其中your_widget 是例如CustomButton 的新实例.

      【讨论】:

      • 我是 python 和 kivy 的新手。我已经根据多个示例将此代码作为基础,这就是我让事情发挥作用的方式。不过我明白你的意思。我会尝试改变它。我需要能够以编程方式添加我的 CustomButton 并获得与使用 .kv 文件相同的结果。有什么想法吗?
      • 我注意到另一个错误,&lt;CustomButton@Button&gt;: 应该只是 &lt;CustomButton&gt;,因为这个小部件有一个基本类型的 python 声明。
      • 我不清楚你在获得与 kv 相同的结果时遇到了什么问题,但也许你的意思是你想设置这些属性,在这种情况下你应该在 CustomButton 声明中声明它们(例如wid = StringProperty(''))然后可以在实例化中设置它们(例如CustomButton(wid="4"))。
      • 感谢您的反馈,但我希望看到我的代码的修改副本。我想我明白你在说什么,但一个可行的例子会更清楚。您将如何编写它以获得与我已有的结果相同的结果?
      • 使用 StringProperty() 方法有助于设置我的自定义控件的属性。
      猜你喜欢
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多