返回
如何在 GNOME 文件选择器中使用 at-spi2 输入 Ctrl-L?
Linux
2024-03-26 14:28:36
使用 at-spi2 在 GNOME 文件选择器中输入 Ctrl-L
在自动化文件选择任务时,在 GNOME 文件选择器对话框中输入 Ctrl-L 非常有用。本文将分步指导您如何使用 at-spi2 在 GNOME 文件选择器中发送 Ctrl-L 键入。
搜索 Chrome 文件选择器
第一步是搜索 Chrome 文件选择器。这是使用 at-spi2 完成的。at-spi2 是一个 API,用于与辅助技术(例如屏幕阅读器)进行交互。
import atspi
def search_chrome_filechooser():
if not atspi.is_initialized():
err = atspi.init()
if err != 0:
print("Something Error:", err)
return
root = atspi.get_desktop(0)
app = search_widget(root, "xdg-desktop-portal-gnome", "application")
if app == None:
print("app not found")
return
dialog = search_widget(app, role_name="dialog")
if dialog is None:
print("file chooser dialog not found")
if atspi.is_initialized():
atspi.exit()
return
使用 at-spi2 发送键盘输入
找到文件选择器后,可以使用 at-spi2 发送键盘输入。atspi.generate_keyboard_event() 方法用于此目的。
atspi.generate_keyboard_event(29, None, atspi.KeySynthType.PRESS)
atspi.generate_keyboard_event(38, None, atspi.KeySynthType.PRESSRELEASE)
if atspi.is_initialized():
atspi.exit()
此代码将向文件选择器发送 Ctrl-L 键入。
完整示例
以下是使用 at-spi2 在 GNOME 文件选择器中输入 Ctrl-L 的完整示例:
import atspi
def search_widget(root, name: str|None=None, role_name:str|None=None):
widget = root
if widget == None:
return None
if name == None and role_name == None:
return
widget_name = widget.get_name()
widget_role_name = widget.get_role_name()
if name == widget_name and role_name == None:
return widget
elif name == None and role_name == widget_role_name:
return widget
elif name == widget_name and role_name == widget_role_name:
return widget
num = widget.get_child_count()
for v in range(num):
child = widget.get_child_at_index(v)
if (result := search_widget(child, name, role_name)) != None:
return result
def search_chrome_filechooser():
if not atspi.is_initialized():
err = atspi.init()
if err != 0:
print("Something Error:", err)
return
root = atspi.get_desktop(0)
app = search_widget(root, "xdg-desktop-portal-gnome", "application")
if app == None:
print("app not found")
return
dialog = search_widget(app, role_name="dialog")
if dialog is None:
print("file chooser dialog not found")
if atspi.is_initialized():
atspi.exit()
return
atspi.generate_keyboard_event(29, None, atspi.KeySynthType.PRESS)
atspi.generate_keyboard_event(38, None, atspi.KeySynthType.PRESSRELEASE)
if atspi.is_initialized():
atspi.exit()
search_chrome_filechooser()
常见问题解答
1. 为什么我无法发送 Ctrl-L 键入?
确保您已正确安装 at-spi2 绑定。您还应该检查是否具有发送键盘输入的权限。
2. 我可以使用 at-spi2 发送其他键盘输入吗?
是的,可以使用 at-spi2 发送任何键盘输入。有关详细信息,请参阅 at-spi2 文档。
3. 如何检查文件选择器是否处于焦点?
可以使用 at-spi2 的 get_active_window() 方法来检查文件选择器是否处于焦点。
4. 我可以在所有应用程序中使用此方法吗?
此方法在使用 at-spi2 的所有应用程序中都可用。但是,它可能无法在所有应用程序中正常工作。
5. 我如何获得更多有关 at-spi2 的帮助?
您可以参阅 at-spi2 文档或在网上搜索更多信息。