python - kivy通过python动态添加自定义小部件到布局

标签 python dynamic widget kivy

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

主要.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 语言文件。 非常感谢任何帮助。

最佳答案

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

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

主要.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"

关于python - kivy通过python动态添加自定义小部件到布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28577828/

相关文章:

php - 在 div 中加载内容而不刷新主页

java - 将对象添加到数组时动态增加数组长度

javascript - 聊天小部件的通知

Python re.sub() 不会替换所有匹配项

python - 没有基本名称的文件的路径

xslt - 使用 xsl :choose 动态定义 XSLT 变量

android - 如何使用其所有属性扩展小部件

c++ - 向 Qt Designer 添加小部件

python - 根据条件设置 Pandas 造型

Python:函数被调用一次后,如果我再次调用它会打印0