如何从弹出窗口向 boxlayout 添加新标签?
Posted
技术标签:
【中文标题】如何从弹出窗口向 boxlayout 添加新标签?【英文标题】:How to add new label to boxlayout from popup? 【发布时间】:2019-10-16 20:55:29 【问题描述】:我的屏幕有两个盒子布局。第一个是空的。第二个有打开弹出窗口的按钮。在弹出窗口中,我有 2 个文本输入和复选框。我也想将这些文本输入作为标签添加到该 boxlayout 和复选框中。
如果我在那个屏幕上有按钮,我可以将按钮添加到 boxlayout。但是一旦我们去弹出窗口,我就无法弄清楚该怎么做。
派。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen, ScreenManager
class MyPopup(Popup):
pass
class MainScreen(Screen):
pass
class SecondScreen(Screen):
def fire_popup(self):
pops = MyPopup()
pops.open()
class ScreenManagement(ScreenManager):
def changescreen(self, value):
try:
if value !='main':
self.current = value
except:
print('No Screen named'+ value)
class testiApp(App):
def build(self):
self.title = 'Hello'
def add_more(self):
addbutton = self.root.get_screen('Page2').ids.empty
addbutton.add_widget(Button(text='Hello'))
def remove(self):
container = self.root.get_screen('Page2').ids.empty
if len(container.children) > 0:
container.remove_widget(container.children[0])
testiApp().run()
千伏。
<MyPopup>:
id:pop
size_hint: .4, .4
auto_dismiss: False
title: 'XXX!!'
BoxLayout:
orientation:'vertical'
BoxLayout:
orientation:'horizontal'
Label:
text:'X1'
TextInput:
id: X1
Label:
text:'X2'
TextInput:
id:X2
CheckBox:
id:X3
BoxLayout:
orientation:'horizontal'
Button:
text:'Add'
on_release: app.add_more()
Button:
text: 'Close'
on_press: pop.dismiss()
ScreenManagement:
MainScreen:
name:'Main'
SecondScreen:
name:'Page2'
<MainScreen>:
name:'Main'
BoxLayout:
Button:
text:'Next Page'
on_release: app.root.current ='Page2'
<SecondScreen>:
name:'Page2'
BoxLayout:
orientation:'vertical'
BoxLayout:
orientation:'vertical'
Label:
text:'Popup Test'
ScrollView:
GridLayout:
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
row_default_height: 60
cols:1
id:empty
BoxLayout:
Button:
text:'Open Popup'
on_press: root.fire_popup()
Button:
text:'Add'
on_release: app.add_more()
Button:
text:'remove'
on_release: app.remove()
【问题讨论】:
除了您的add_more()
方法中的text= root.
错误,它似乎对我来说工作正常。也许不清楚你想要什么。
我在玩代码时不小心添加了那个 text=root。原来只是 text='hello'
【参考方案1】:
问题
我想将这些文本输入作为标签添加到该 boxlayout 和 复选框。
解决方案
解决方案涉及对 kv 文件和 Python 脚本的增强。
kv 文件
实现类规则的视图,<Row>:
将X1
、X2
、X3
的值传递给方法add_more()
可选:将属性添加到ScrollView:
片段 - kv 文件
<Row>:
x1: ''
x2: ''
x3: False
Label:
text: root.x1
Label:
text: root.x2
CheckBox:
active: root.x3
<MyPopup>:
...
BoxLayout:
orientation:'horizontal'
Button:
text:'Add'
on_release: app.add_more(X1.text, X2.text, X3.active)
...
<SecondScreen>:
...
ScrollView:
bar_width: 10
bar_color: 1, 0, 0, 1 # red
bar_inactive_color: 0, 0, 1, 1 # blue
effect_cls: "ScrollEffect"
scroll_type: ['bars', 'content']
py 文件
声明一个class Row()
,继承BoxLayout
。
声明x1
、x2
和x3
类型为StringProperty
和BooleanProperty
的类属性
实现构造函数以填充x1
、x2
和x3
修改方法add_more()
接受x1
、x2
和x3
片段 - py 文件
class Row(BoxLayout):
x1 = StringProperty('')
x2 = StringProperty('')
x3 = BooleanProperty(False)
def __init__(self, x1, x2, x3, **kwargs):
super(Row, self).__init__(**kwargs)
self.x1 = x1
self.x2 = x2
self.x3 = x3
class testiApp(App):
...
def add_more(self, x1, x2, x3):
addbutton = self.root.get_screen('Page2').ids.empty
addbutton.add_widget(Row(x1, x2, x3))
输出
【讨论】:
感谢 ikolim,你是王者!这正是我想要实现的。一旦你看到它,这一切似乎都是那么简单。我知道我需要字符串和布尔属性,但我太新手了,无法弄清楚如何构建这一切。非常感谢! 顺便说一句,你有想法如何删除由弹出窗口组成的行吗?我可以在删除按钮的行上添加第 4 个小部件。因此,单击该按钮后,该按钮所在的特定行将被删除。 请打开一个新问题以删除特定行。谢谢。【参考方案2】:如果我了解您要做什么,您可以通过保存对在您的 SecondScreen
中创建的 MyPopup
的引用,从您的 TextInput
获取 text
:
class SecondScreen(Screen):
def fire_popup(self):
self.pops = MyPopup()
self.pops.open()
然后在您的 add_more()
方法中使用该引用:
def add_more(self):
addbutton = self.root.get_screen('Page2').ids.empty
addbutton.add_widget(Button(text=self.root.current_screen.pops.ids.X1.text))
当然,您也可以类似地引用X2
。
【讨论】:
如果我将您建议的 add_more 替换为原始 add_more 并尝试添加新按钮,我将收到此错误消息 'SecondScreen' object has no attribute 'pops' 您还必须像上面那样修改SecondScreen
。
您的Add
按钮(不在Popup
中的按钮)需要自己的不同add_more()
。以上是关于如何从弹出窗口向 boxlayout 添加新标签?的主要内容,如果未能解决你的问题,请参考以下文章