PyObjC Accessibility Framework

12.1 · active · verified Tue Apr 14

The `pyobjc-framework-accessibility` library provides Python wrappers for the macOS Accessibility framework, enabling programmatic interaction with user interface elements and assistive technologies. Currently at version 12.1, it is part of the broader PyObjC project, which typically releases updates in close synchronicity with new macOS versions and Python support cycles.

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to obtain the system-wide accessibility element and query basic information about the frontmost application. Running this code requires granting specific Accessibility permissions to your Python process in macOS System Settings.

import Accessibility
import AppKit

# IMPORTANT: This code requires granting accessibility permissions to the
# Python process (e.g., Terminal.app or your IDE) in macOS System Settings >
# Privacy & Security > Accessibility. Without permissions, most Accessibility
# functions will fail or return None.

def get_accessibility_info():
    # Get the system-wide accessibility element
    system_wide_element = Accessibility.AXUIElementCreateSystemWide()

    if not system_wide_element:
        print("Could not create system-wide accessibility element. Check permissions.")
        return

    print(f"System-wide element description: {system_wide_element.description()}")

    # Get the currently focused application
    workspace = AppKit.NSWorkspace.sharedWorkspace()
    frontmost_app = workspace.frontmostApplication()

    if frontmost_app:
        app_name = frontmost_app.localizedName()
        app_pid = frontmost_app.processIdentifier()
        print(f"\nFrontmost Application: {app_name} (PID: {app_pid})")

        # Create an accessibility element for the frontmost application
        app_ax_element = Accessibility.AXUIElementCreateApplication(app_pid)

        if app_ax_element:
            try:
                # Attempt to get common attributes
                role = app_ax_element.attributeForKey_(Accessibility.kAXRoleAttribute)
                title = app_ax_element.attributeForKey_(Accessibility.kAXTitleAttribute)

                print(f"  Role: {role if role else 'N/A'}")
                print(f"  Title: {title if title else 'N/A'}")

            except Exception as e:
                print(f"  Error accessing app attributes (permissions?): {e}")
        else:
            print(f"  Could not create AXUIElement for {app_name}.")
    else:
        print("No frontmost application found.")

# Call the function, ensuring it's wrapped to explain permissions
print("Attempting to get Accessibility information...")
get_accessibility_info()
print("\nRemember to grant Accessibility permissions to your Python environment in macOS System Settings > Privacy & Security > Accessibility.")

view raw JSON →