kivy - 绑定弹出窗口关闭以从另一个小部件实例中运行
Posted
技术标签:
【中文标题】kivy - 绑定弹出窗口关闭以从另一个小部件实例中运行【英文标题】:kivy - bind popup dismiss to function from another widget instance 【发布时间】:2018-11-30 04:31:24 【问题描述】:我想将弹出窗口的关闭(或按下该弹出窗口小部件中的按钮)绑定到打开此弹出窗口的小部件的功能。
更具体地说,
#:kivy 1.10.0
#:import Factory kivy.factory.Factory
<MainBox>:
SelectButton:
id: selectbutton
text: 'Select'
on_press: Factory.SelectPopup().open()
Button:
text: 'Ask'
background_color: (0,1,0,1) if selectbutton.selected else (1,0,0,1)
<SelectPopup>:
title: 'Select from List'
auto_dismiss: False
on_dismiss: Factory.SelectButton().set_selection()
BoxLayout:
Label:
text: 'hello'
Button:
text: 'ok'
#on_press: Factory.SelectButton().set_selection()
on_press: root.dismiss()
在 .py 文件中
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import BooleanProperty
from kivy.uix.popup import Popup
class SelectButton(Button):
selected = BooleanProperty(False)
def set_selection(self):
self.selected = True
class SelectPopup(Popup):
pass
class MainBox(BoxLayout):
pass
class SelectButtonApp(App):
def build(self):
return MainBox()
if __name__ == "__main__":
SelectButtonApp().run()
也就是说,当我关闭按SelectButton
打开的弹出窗口时,我想将属性selected
从SelectButton
设置为True
。尝试的方式不起作用,我猜是因为on_dismiss
调用没有引用MainBox
中的SelectButton
实例。我也尝试使用ids
,但似乎无法在MainBox
和SelectPopup
等不相关的小部件之间轻松传递它们。任何帮助将非常感激。
【问题讨论】:
【参考方案1】:使用app.root.ids
访问项目。有两种解决方案。
解决方案 1 - 直接访问,即不要调用 set_selection() 函数
直接引用selected
即没有 set_selection()
函数。
Button:
text: 'ok'
on_press:
app.root.ids.selectbutton.selected = True
root.dismiss()
解决方案 2 - 调用 set_selection() 函数
调用 set_selection() 函数。
Button:
text: 'ok'
on_press:
app.root.ids.selectbutton.set_selection()
root.dismiss()
输出
【讨论】:
以上是关于kivy - 绑定弹出窗口关闭以从另一个小部件实例中运行的主要内容,如果未能解决你的问题,请参考以下文章
Kivy:弹出窗口只能有一个小部件作为内容(当我导入两个不同的弹出模块时)