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 打开的弹出窗口时,我想将属性selectedSelectButton 设置为True。尝试的方式不起作用,我猜是因为on_dismiss 调用没有引用MainBox 中的SelectButton 实例。我也尝试使用ids,但似乎无法在MainBoxSelectPopup 等不相关的小部件之间轻松传递它们。任何帮助将非常感激。

【问题讨论】:

【参考方案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:从另一个弹出窗口中关闭一个弹出窗口

Kivy:弹出窗口只能有一个小部件作为内容(当我导入两个不同的弹出模块时)

Kivy 更改标签小部件来自另一个类的文本

Kivy - 检查当前是不是显示弹出窗口(因为 Kivy 弹出窗口不是真正的模态(后退按钮/键盘))

Kivy:从另一个类的小部件中检索文本?

在 Kivy 中,如何使用另一个类的关闭按钮关闭弹出窗口?