访问 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.caller
在StartPop
对象中访问它
【讨论】:
这很有意义。我按照建议通过 init 使用 kwargs 实现了,效果很好,谢谢! @Daniel 请注意,有时kwargs.pop()
应该更有用或更安全,主要是如果您使用的变量名可能已在您继承的类中使用。但是,pop
在不存在此类键时返回KeyError
(kwargs
只是一个字典),所以...取决于我要说的口味/用例。以上是关于访问 kivy 弹出父级的主要内容,如果未能解决你的问题,请参考以下文章