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

2022-01-15 00:00:00 python kivy widget dynamic

问题描述

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

I was able to get my layout working with static kivy language but I need to be able to add items to my list via python. I've tried several things but can't seem to get anything working correctly. Here's what I have working statically.

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
Picked On: 12/26/2014, 2:01 PM"

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

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

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

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

I just need to be able to add each CustomButton programmatically to my layout rather than via the kivy language file. Any help is greatly appreciated.


解决方案

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

Here's the working code showing some items added in kivy language and then some additional items added programmatically. I also added the ScrollView, a configuration setting to keep the window from being resized and code to highlight the selected item.

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

I hope this is helpful to someone in the future. :)

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
Picked 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?
Picked 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
Picked 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
Picked 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
Picked On: 12/26/2014, 2:01 PM"

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

    ButtonListItem:
        wid: "2"
        image: "ico/strawberry.png"
        title: "xstrawberry"
        label: "Strawberry: Yummy Yummy
Picked On: 5/6/2014, 2:01 PM"

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

相关文章