如何从弹出窗口向 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 文件

实现类规则的视图,&lt;Row&gt;:X1X2X3 的值传递给方法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。 声明x1x2x3类型为StringPropertyBooleanProperty的类属性 实现构造函数以填充x1x2x3 修改方法add_more()接受x1x2x3

片段 - 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 添加新标签?的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 标签和弹出窗口 + 长文本

outlook新邮件提示怎么设置?

从弹出窗口将 UIViewController 推送到 UINavigationController

Kendo Grid - 从弹出窗口编辑后刷新行

从弹出框内的按钮更改视图

Kivy - 从弹出窗口自动启动方法