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

Ng *_*-Ee 4 python widget popup kivy

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

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

如果我从 Popup 继承并绑定到返回 True 的 Window.on_key_down,那么我可以从我的继承类中处理后退按钮。在这一点上,我可以在 on_dismiss 中取消绑定或删除小部件(似乎无法使删除可靠地工作,但这不是一个单独的问题)。

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

选项1

在根小部件中初始化了一个弹出小部件,所有屏幕都将在必要时修改/open()。当然,这将需要绑定/取消绑定该弹出窗口的按钮。然后,根小部件可以轻松检查该单个对象以查看其是否打开。

选项 2

在从弹出窗口小部件继承的类中处理键盘,并在最后解除键盘绑定。将返回按钮处理拆分为多个文件/屏幕的问题,以及在长时间使用应用程序时构建旧的弹出窗口小部件的问题。

选项 3

???

Ben*_*ock 5

假设您正在运行一个 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()
Run Code Online (Sandbox Code Playgroud)

弹出窗口将Popup在其open()方法中为 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()
Run Code Online (Sandbox Code Playgroud)