具有自动隐藏功能的 Pi 虚拟键盘
Virtual keyboard for the Pi with auto-hide functionality
我正在使用 PyGObject 创建一个 UI,它将在连接到 Pi 3 运行ning Raspbian 的 7" 官方 RPi 触摸屏上 运行。作为此界面的一部分,UI 将需要一个屏幕键盘。我知道有两个适用于 Pi 的虚拟键盘程序:Matchbox Keyboard 和 Florence。
问题是我想尽可能地模仿智能手机键盘的行为,但不知道该怎么做。我想要做的与 this 类似,除了我希望键盘自动隐藏并位于主 window 之上。如何做到这一点?
编辑:我已经尝试了这两个程序,但一直无法弄清楚如何实现这一点。我在 Matchbox 键盘中找不到自动弹出选项,有些人报告说它具有此功能 (here), others say no (here)。我假设一些 Linux 桌面管理器支持此功能,但 Pi 上的 LXDE 不支持。
Florence 似乎很有前途,因为它有一个自动隐藏选项,听起来它会做我想做的事,但当我选择它时它似乎不起作用。
我终于想出了如何为火柴盒键盘添加自动隐藏行为。首先,我阅读了有关 --daemon
命令行参数 here 的信息,这听起来像是可行的,但是当我尝试它时,自动隐藏功能仅适用于部分而非全部文本条目。
同一个 README 文件说:
You can embed matchbox-keyboard into other applications with toolkits
that support the XEMBED protocol ( GTK2 for example ).
See examples/matchbox-keyboard-gtk-embed.c for how its done.
我以前知道这个,但不认为它适用于 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()
我正在使用 PyGObject 创建一个 UI,它将在连接到 Pi 3 运行ning Raspbian 的 7" 官方 RPi 触摸屏上 运行。作为此界面的一部分,UI 将需要一个屏幕键盘。我知道有两个适用于 Pi 的虚拟键盘程序:Matchbox Keyboard 和 Florence。
问题是我想尽可能地模仿智能手机键盘的行为,但不知道该怎么做。我想要做的与 this 类似,除了我希望键盘自动隐藏并位于主 window 之上。如何做到这一点?
编辑:我已经尝试了这两个程序,但一直无法弄清楚如何实现这一点。我在 Matchbox 键盘中找不到自动弹出选项,有些人报告说它具有此功能 (here), others say no (here)。我假设一些 Linux 桌面管理器支持此功能,但 Pi 上的 LXDE 不支持。
Florence 似乎很有前途,因为它有一个自动隐藏选项,听起来它会做我想做的事,但当我选择它时它似乎不起作用。
我终于想出了如何为火柴盒键盘添加自动隐藏行为。首先,我阅读了有关 --daemon
命令行参数 here 的信息,这听起来像是可行的,但是当我尝试它时,自动隐藏功能仅适用于部分而非全部文本条目。
同一个 README 文件说:
You can embed matchbox-keyboard into other applications with toolkits that support the XEMBED protocol ( GTK2 for example ).
See examples/matchbox-keyboard-gtk-embed.c for how its done.
我以前知道这个,但不认为它适用于 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()