Kivy 触摸和键盘事件传递到桌面

Kivy touch and keyboard events passing through to desktop

我正在使用 Kivy 框架在 Python 中开发一个 UI 应用程序 3. Kivy 应用程序是全屏的。每当我使用物理键盘执行触摸事件或键入时,底层桌面环境将接收触摸和键盘事件以及我的 Kivy 应用程序。

例如,如果我在桌面上打开一个文本文件,然后 运行 我的 Kivy 应用程序,我可以在 Kivy 应用程序在前台(全屏)时盲目地将文本键入文本文件. Kivy 应用程序忽略了物理键盘输入,因为我在配置文件中将 keyboard_mode 选项设置为 dock

触摸事件在我的 Kivy 应用程序中正常工作,我能够 select 执行指定操作的按钮;但是,触摸事件也将传递到桌面。我通过盲目双击我的 Kivy 应用程序然后返回桌面发现大量打开的应用程序(通过我桌面上的快捷方式)来意识到这一点。 Raspberry Pi 社区的一名成员也遇到了这个问题,但没有成功:https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=132054.

这是我的简单main.kv文件供参考:

<Controller>:
    ActionBar:
        pos_hint: {'top':1}
        ActionView:
            use_separator: True
            ActionPrevious:
                title: 'Action Bar'
                with_previous: False
                on_release: root.action_close()

    BoxLayout:
        Label:
            text: "Test"

还有我的main.python文件:

import kivy
from kivy.uix.floatlayout import FloatLayout
from kivy.app import App

class Controller(FloatLayout):

    def action_close(self):
        App.get_running_app().stop()

class ControllerApp(App):

    def build(self):
        self.load_kv('main.kv')
        return Controller()

ControllerApp().run()

以及我的 config.ini Kivy 文件中的相关片段:

[kivy]
keyboard_repeat_delay = 300
keyboard_repeat_rate = 30
log_dir = logs
log_enable = 1
log_level = info
log_name = kivy_%y-%m-%d_%_.txt
window_icon = 
keyboard_mode = dock
keyboard_layout = qwerty
desktop = 1
exit_on_escape = 1
pause_on_minimize = 0
config_version = 14

[graphics]
display = -1
fullscreen = auto
height = 600
left = 0
maxfps = 60
multisamples = 2
position = auto
rotation = 0
show_cursor = 1
top = 0
width = 800
resizable = 1
borderless = 0
window_state = visible
minimum_width = 0
minimum_height = 0

[input]
mouse = mouse
mtdev_%(name)s = probesysfs,provider=mtdev
hid_%(name)s = probesysfs,provider=hidinput

...

我试过使用配置文件中的值,最值得注意的是 window_statefullscreenkeyboard_mode 选项但没有成功。 Kivy配置信息可以查到here。在 Google 上进行了各种搜索,但在这里一无所获,我们将不胜感激。

我认为这是由于使用 Kivy 的特定于 rpi 的 window 提供程序造成的,该提供程序使用与硬件的低级接口以更有效地执行,但反过来不与桌面交互一种正常的方式 - 具体来说,输入和绘图绕过正常机制。

如果你想在桌面上使用该应用程序,我认为你可以通过重新编译 Kivy 来使用正常的 window 后端(最好是 SDL2),尽管这可能 运行 更慢。但是,如果您实际上不需要桌面(例如,如果 Kivy 是唯一需要 运行 的东西),这个 window 提供程序的另一个优点是它实际上不需要 X11 等,在这种情况下,您可以不启动它们来避免出现问题。

另请参阅有关该主题的 github issue