kivy通过python动态将自定义窗口小部件添加到布局 [英] kivy dynamically add custom widget to layout via python
问题描述
我能够使布局使用静态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()
selectfruit.kv
selectfruit.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语言文件。
我们将不胜感激。
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.
推荐答案
以下是工作代码,其中显示了一些用猕猴桃语言添加的项目,然后显示了其他一些内容以编程方式添加的项目。我还添加了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\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()
selectfruit.kv
selectfruit.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"
这篇关于kivy通过python动态将自定义窗口小部件添加到布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!