访问 kivy 弹出父级

Posted

技术标签:

【中文标题】访问 kivy 弹出父级【英文标题】:Access kivy popup parent 【发布时间】:2017-02-25 16:57:08 【问题描述】:

在 kivy 中实现弹出窗口的方式,弹出窗口似乎附加到窗口而不是创建弹出窗口的父对象。弹出窗口带有 self.dismiss() 来关闭弹出窗口,但我无法找到访问“父”对象的任何方法,因为尽管创建了弹出窗口,但它似乎存在于它之外。

示例 sn-ps:

class StartButton(ActionButton)
    def on_release(self):
        self.popup = StartPop(id='popid')
        self.popup.open()

class StartPop(Popup):
    def close(self):
        self.dismiss()
    def start(self):
        print(self)
        print(self.parent)

打印命令的结果是

<__main__.StartPop object at 0x00000000037BBCE0>

<kivy.core.window.window_sdl2.WindowSDL object at 0x000000000373B0B0>

因此,与其父级是 StartButton,我还希望访问其父级等。父级是 Window。

我不知道如何绑定任何与我用来创建弹出窗口的小部件交互的函数。我需要能够让父对象及其父对象根据我在弹出窗口中单击的内容来执行操作,但我不知道如何实现。

在.kv文件中

<StartPop>:
    title: 'Popup'
    auto_dismiss: True
    size_hint: None,None
    size: 400,250
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'sample text here'
            text_size: self.size
            halign: 'center'
            valign: 'middle'
        BoxLayout:
            orientation: 'horizontal'
            Button:
                size_hint: 1,0.5
                text: 'Cancel'
                on_release: root.close()
            Button:
                size_hint: 1,0.5
                text: 'Start Testing'
                on_release: root.start()

【问题讨论】:

【参考方案1】:

之所以这样实现,是因为它大部分时间都需要隐藏,但仍处于活动状态,以便可以调用open()。 Kivy 似乎没有以其他方式隐藏小部件,实际上 删除 它并在某处保留引用(没有 hide 属性),所以甚至可能是因为这个。或者因为这样更容易实现。然而,它的实现并不差,而且 OO 编程的工作方式你也可以用它做一些花哨的事情。你想要的东西可以用kwargs in __init__简单处理:

从 Popup 继承并获取自定义关键字参数:

class StartPop(Popup):
    def __init__(self, **kwargs):
        self.caller = kwargs.get('caller')
        super(StartPop, self).__init__(**kwargs)
        print self.caller

然后创建该自定义 Popup 的实例并设置父级:

pop = StartPop(caller=self)
pop.open()

caller 关键字不仅限于 Kivy 小部件。将任何您想使用的对象放在那里,然后您可以通过self.callerStartPop 对象中访问它

【讨论】:

这很有意义。我按照建议通过 init 使用 kwargs 实现了,效果很好,谢谢! @Daniel 请注意,有时kwargs.pop() 应该更有用或更安全,主要是如果您使用的变量名可能已在您继承的类中使用。但是,pop 在不存在此类键时返回KeyErrorkwargs 只是一个字典),所以...取决于我要说的口味/用例。

以上是关于访问 kivy 弹出父级的主要内容,如果未能解决你的问题,请参考以下文章

Kivy Popup 无法访问 root 方法

width:100%与绝对定位同时存在,偏移出父级容器

如何从另一个类/屏幕 kivy 访问值

从小部件的父级访问坐标

Kivy (MD) - 分离 Kivy 类时如何访问类属性?

使用 Kivy 访问类变量