树莓派自动隐藏功能的虚拟键盘

7
我正在使用PyGObject创建一个UI,该UI将在连接到运行Raspbian的Pi 3上的7英寸官方RPi触摸屏上运行。作为此界面的一部分,UI将需要一个屏幕键盘。我知道两个用于Pi的虚拟键盘程序:Matchbox Keyboard和Florence。
问题是我想尽可能模仿智能手机键盘的行为,但不知道如何做到。我想要做的类似于this,但我希望键盘可以自动隐藏并且在主窗口的顶部。如何实现这一点?

编辑:我已经尝试了这两个程序,但还没有找到如何实现这一点。我无法在Matchbox键盘中找到自动弹出选项,有些人报告说它具有这个功能(这里),而其他人则说没有(这里)。我认为一些Linux桌面管理器支持此功能,但树莓派上的LXDE不支持。

Florence似乎很有前途,因为它具有一个自动隐藏选项,听起来像是我想要的,但当我选择它时似乎没有起作用。

1个回答

3
我终于想出了如何将自动隐藏行为添加到Matchbox键盘中。首先,我阅读了关于--daemon命令行参数here的内容,听起来好像会起作用,但是当我尝试使用它时,自动隐藏功能仅适用于某些文本输入,而不是所有文本输入。
同一README文件还说:

您可以使用支持XEMBED协议(例如GTK2)的工具包将matchbox-keyboard嵌入到其他应用程序中。

有关如何实现,请参见examples/matchbox-keyboard-gtk-embed.c

我之前知道这一点,但是我认为它不能与PyGObject一起使用,直到我发现它确实可以。将这些行添加到我的代码中即可:
p = subprocess.Popen(["matchbox-keyboard", "--xid"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
keyboard = Gtk.Socket()
window.add(keyboard)
keyboard.add_id(int(p.stdout.readline()))

我还创建了一个简单的Gtk.Entry子类,当文本输入框获得或失去焦点时自动隐藏键盘:
class TextEntry(Gtk.Entry):
    def __init__(self, window):
        Gtk.Entry.__init__(self)
        self.keyboard = window.keyboard

        self.connect("focus-in-event", self.on_focus_in)
        self.connect("focus-out-event", self.on_focus_out)

    def on_focus_in(self, event, data):
        self.keyboard.show()

    def on_focus_out(self, event, data):
        self.keyboard.hide()

你有没有注意到CPU使用率达到了100%(pcmanfm与matchbox存在问题)? - theBugger
@theBugger 不是的,可能是因为我没有在pcmanfm中使用它。我只是将它嵌入到我的GTK应用程序中。不过,pcmanfm的问题是一个已知的问题:https://bugs.launchpad.net/raspbian/+bug/1426295 - tjohnson
你的意思是你禁用了pcmanfm还是你没有使用raspbian? - theBugger
1
直到现在我才意识到,即使在另一个应用程序中使用matchbox时也会出现问题,但是错误报告说只有在桌面模式下运行pcmanfm时才会发生问题,而不是在窗口中启动时。我只在窗口中启动它,所以这可能就是为什么我没有看到问题的原因。我在我的Pi上使用标准的Raspbian映像,最新的PIXEL版本。 - tjohnson
太好了!使用--xid参数防止创建窗口(这显然会导致pcmanfm出现问题)。感谢您的帮助! - theBugger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接