Kivy - 检查当前是否显示弹出窗口(因为 Kivy 弹出窗口不是真正的模态窗口(返回 button/keyboard))

Kivy - check if popup is currently showing (because Kivy Popup isn't really modal (back button/keyboard))

我绑定到根小部件中的 Window.on_key_down 以处理 android 的后退按钮。

ModalView(及其子 Popup)不是真正的模态视图,它们根本不处理键盘,因此后退按钮也不处理。

如果我从 Popup 继承并绑定到 Window.on_key_down returns True,那么我可以在我的继承 class 中处理后退按钮。此时我可以在 on_dismiss 中解除绑定或删除小部件(似乎无法可靠地进行删除,但这不是一个单独的问题)。

问题是这将我对后退按钮的处理划分到我所有的屏幕(我使用屏幕管理器)而不是我的根小部件中。因此,我正在寻找一种方法来从我的根小部件中检查当前是否打开了任何弹出窗口(最好不要遍历小部件树,因为不会很好地缩放)。请就我在下面考虑的选项以及任何其他建议提出建议:-

选项 1

一个单独的弹出窗口小部件在根小部件中初始化,必要时所有屏幕都会 modify/open()。当然,这将需要 binding/unbinding 该弹出窗口的按钮。然后,根小部件可以轻松地检查这个单个对象,看它是否打开。

选项 2

在class继承自弹出窗口小部件中处理键盘,并在最后取消绑定键盘。将后退按钮处理拆分为多个 files/screens 的问题,以及在长时间使用该应用程序后构建旧的弹出窗口小部件的问题。

选项 3

???

假设您是 运行 kivy 应用程序 (kivy.app),您可以在后退按钮回调中执行以下操作:

from kivy.app import App
from kivy.uix.popup import Popup

if isinstance(App.get_running_app().root_window.children[0], Popup):
    App.get_running_app().root_window.children[0].dismiss()

弹出窗口将在其 open() 方法中将类型 Popup 的对象添加到 window 对象(默认行为 add_widget(),假定插入索引为 0 ).

在稍微复杂的情况下(多个弹出窗口或使用 inspector 模块),遍历所有子项也可以。

from kivy.app import App
from kivy.uix.popup import Popup

for widget in App.get_running_app().root_window.children:
    if isinstance(widget, Popup):
        widget.dismiss()