如何使用 Kivy 从 class 外部添加小部件
How to add Widgets from outside class with Kivy
喂!我这里有这个应用程序,一种“待办事项列表”。当我按下“添加项目”按钮时,它会打开一个 PopUp Window,我想在按下“向上”按钮时在“ItemsList”中添加“ItemTemplate”。我是 Kivy 的新手,最近几天我尝试这样做。我该怎么做?
非常感谢!
Python代码:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.popup import Popup
class FirstBox(BoxLayout):
def btn(self):
Pu().open()
class ItemsList(GridLayout):
pass
class ItemTemplate(BoxLayout):
pass
class Pu(Popup):
pass
class MyAppApp(App):
pass
MyAppApp().run()
Kv代码:
FirstBox:
<FirstBox>:
orientation: "vertical"
BoxLayout:
ScrollView:
ItemsList:
size_hint: 1, None
height: self.minimum_height
Button:
size_hint: 1,0.2
text: "Add Item"
on_release: root.btn()
<ItemsList>:
cols: 1
size_hint_y: None
ItemTemplate:
ItemTemplate:
ItemTemplate:
<ItemTemplate>:
size_hint: 1, None
CheckBox:
size_hint: 0.15, 1
Button:
text: "Task Name"
Button:
text: "Some action"
size_hint: 0.15,1
<Pu>:
size_hint: 1, 0.3
BoxLayout:
orientation: "vertical"
TextInput:
Button:
text: "Up"
为您的 ItemList
提供 ID 以添加小部件,为 TextInput
提供从中获取文本的 ID。
ItemsList:
id: viewlist
和
TextInput:
id: new_task_input_id
使用 StringProperty
动态更改 ItemTemplate 的文本:
from kivy.properties import StringProperty
class ItemTemplate(BoxLayout):
task_text = StringProperty()
编辑 .kv 侧动态:( ItemTemplate 的按钮 )
Button:
text: root.task_text
触发器 向上按钮 在 .kv 侧:on_release: root.add_item()
在 Pu class 中创建此函数并添加此操作:
def add_item(self,*args):
firstbox = App.get_running_app().root #access correctly main layout
itemlist = firstbox.ids.viewlist #find viewlist by id
new_task_text = self.ids.new_task_input_id.text #get textinput text
item = ItemTemplate() #create custom item
item.task_text = new_task_text #set item text
itemlist.add_widget(item) #add item to layout
短函数:
App.get_running_app().root.ids.viewlist.add_widget(ItemTemplate(task_text=self.ids.new_task_input_id.text))
让我们在添加新项目后关闭弹出窗口:
self.dismiss()
此外,如果您想将此小部件添加到顶部,需要在 add_widget
中提供索引:
itemlist.add_widget(item,len(itemlist.children))
喂!我这里有这个应用程序,一种“待办事项列表”。当我按下“添加项目”按钮时,它会打开一个 PopUp Window,我想在按下“向上”按钮时在“ItemsList”中添加“ItemTemplate”。我是 Kivy 的新手,最近几天我尝试这样做。我该怎么做?
非常感谢!
Python代码:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.popup import Popup
class FirstBox(BoxLayout):
def btn(self):
Pu().open()
class ItemsList(GridLayout):
pass
class ItemTemplate(BoxLayout):
pass
class Pu(Popup):
pass
class MyAppApp(App):
pass
MyAppApp().run()
Kv代码:
FirstBox:
<FirstBox>:
orientation: "vertical"
BoxLayout:
ScrollView:
ItemsList:
size_hint: 1, None
height: self.minimum_height
Button:
size_hint: 1,0.2
text: "Add Item"
on_release: root.btn()
<ItemsList>:
cols: 1
size_hint_y: None
ItemTemplate:
ItemTemplate:
ItemTemplate:
<ItemTemplate>:
size_hint: 1, None
CheckBox:
size_hint: 0.15, 1
Button:
text: "Task Name"
Button:
text: "Some action"
size_hint: 0.15,1
<Pu>:
size_hint: 1, 0.3
BoxLayout:
orientation: "vertical"
TextInput:
Button:
text: "Up"
为您的 ItemList
提供 ID 以添加小部件,为 TextInput
提供从中获取文本的 ID。
ItemsList:
id: viewlist
和
TextInput:
id: new_task_input_id
使用 StringProperty
动态更改 ItemTemplate 的文本:
from kivy.properties import StringProperty
class ItemTemplate(BoxLayout):
task_text = StringProperty()
编辑 .kv 侧动态:( ItemTemplate 的按钮 )
Button:
text: root.task_text
触发器 向上按钮 在 .kv 侧:on_release: root.add_item()
在 Pu class 中创建此函数并添加此操作:
def add_item(self,*args):
firstbox = App.get_running_app().root #access correctly main layout
itemlist = firstbox.ids.viewlist #find viewlist by id
new_task_text = self.ids.new_task_input_id.text #get textinput text
item = ItemTemplate() #create custom item
item.task_text = new_task_text #set item text
itemlist.add_widget(item) #add item to layout
短函数:
App.get_running_app().root.ids.viewlist.add_widget(ItemTemplate(task_text=self.ids.new_task_input_id.text))
让我们在添加新项目后关闭弹出窗口:
self.dismiss()
此外,如果您想将此小部件添加到顶部,需要在 add_widget
中提供索引:
itemlist.add_widget(item,len(itemlist.children))