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

时间:2016-05-25 17:21:34

标签: python kivy raspbian kivy-language

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

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

触摸事件在我的Kivy应用程序中正常工作,我可以选择执行指定操作的按钮;但是,触摸事件也将传递到桌面。我通过盲目双击我的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()

以及Kivy的 config.ini 文件中的相关摘要:

[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。谷歌上的各种搜索都没有发现,任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为这是因为使用Kivy的特定于rpi的窗口提供程序,它使用与硬件的低级接口以便更有效地执行,但反过来又不与桌面交互通常的方式 - 特别是输入和绘图绕过正常的机制。

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

另请参阅此主题的github issue