아티클

NVDA 추가 기능 개발 가이드라인 3부: NVDA 추가 기능의 기본 구성 요소

2019-01-07 16:29:19

안녕하세요. 엔비전스입니다.

지난 NVDA 추가 기능 개발 가이드라인 2부에서 NVDA 추가 기능의 기본 구성 요소 및 글로벌 플러그인, 앱 모듈의 간단한 예제에 대해 살펴보았습니다. 이번 글에서는 NVDA 추가 기능 개발 시 알아야 할 이벤트, 음성을 출력하는 방법과 같은 필수적인 추가 기능 개발의 기본 구성 요소와 추가 기능 개발에 유용한 모듈에 대해 살펴보겠습니다.

들어가기 전에

  • 1부에서 언급한 바와 같이 아티클 전반에서는 NVDA의 추가 기능 패키지(*.nvda-addon)를 사용하지 않으며, NVDA 사용자 환경 폴더에 appModule, globalPlugins 폴더에 작업 결과를 저장합니다. 추가 기능 패키지(*.nvda-addon)을 제작하는 방법은 추후 다룰 예정입니다. NVDA 사용자 환경 폴더를 여는 방법은 NVDA 추가 기능 개발 가이드라인 1부 <추가 기능이 저장된 폴더 열기> 섹션을 참고합니다.
  • NVDA는 Python 언어로 추가 기능을 제작할 수 있습니다. 3부에서 사용한 NVDA에 내장된 클래스, 메소드 왜 Python 언어의 문법, 튜토리얼 등의 자세한 내용은 <Python 공식 문서 웹사이트>를 참고하세요.
  • NVDA에 기본으로 포함된 추가 기능을 위한 모듈에 대해서는 NVDA 추가 기능 모듈 문서를 통해 내장 모듈, 클래스 및 메소드에 대한 설명을 확인할 수 있습니다.

용어 설명

이번 아티클에서 사용되는 주요 용어에 대한 설명은 다음과 같습니다:
  • 변수(Variable): 변수는 사람 이름, 실행 중인 NVDA 추가 기능의 이름, 현재 작업 중인 객체의 이름, 사용 중인 NVDA 버전 등과 같이 다양한 값을 저장할 수 있는 공간입니다. 추가 기능 파일은 하나 이상의 변수를 정의할 수 있습니다.
  • 클래스(Class): 클래스는 비슷한 객체를 하나의 그룹으로 묶어주는 객체 지향 프로그래밍 언어의 기본 구성 요소 중 하나입니다. 사람, 책상, NVDA 추가 기능 등이 대표적인 예입니다.
  • 메소드(Method): 메소드(또는 함수 라고도 함)는 비프음을 생성하고, 큰 수를 계산하고, NVDA 추가 기능을 로드하는 등의 작업을 수행하는 프로그램이 실행되는 짧은 프로그램 또는 루틴입니다.
  • 객체(Object): Python에서의 객체는 어떠한 속성값과 행동을 가지고 있는 데이터입니다. 이러한 것들에는 숫자, 문자, 함수 등이 있습니다. NVDA에서 객체는 버튼, 체크박스, 편집 가능한 필드, 도구 모음, 슬라이더 및 응용 프로그램 창과 같은 프로그램 일부를 나타냅니다.

화면상의 객체 작업하기

NVDA에서 객체는 컨트롤 또는 프로그램의 일부를 나타냅니다. 여기에는 버튼, 체크박스, 편집 가능한 필드, 도구 모음, 슬라이더 및 응용 프로그램 창 등이 포함됩니다. NVDA 사용자뿐만 아니라 스크린 리더 사용자는 이러한 객체들을 키보드를 사용하여 탐색하고 조작합니다.
NVDA를 사용할 때 이러한 객체의 동작을 변경하여 NVDA 사용자의 탐색을 향상시킬 수 있습니다.
NVDA 객체는 계층적으로 구성되거나 부모 - 자식 관계로 구성됩니다. 예를 들어 Windows 탐색기의 목록 개체에는 하나 이상의 목록 항목이 포함될 수 있으며, 이 목록의 부모는 Windows 탐색기 창일 수 있습니다. 키보드를 통해 현재 초점이 위치한 객체를 초점 객체(focus object)라고 하며, 키보드 초점을 벗어나지 않고도 어디에서나 탐색할 수 있는 객체를 탐색 객체(navigator object)라고 합니다. 탐색 객체는 키보드 초점 여부와 상관없이 어디에서나 사용할 수 있는 객체입니다. NVDA 사용자는 현재 초점을 받은 객체에서 벗어나지 않고도 NVDA의 탐색 객체를 통해 응용 프로그램을 탐색할 수 있습니다.
NVDA 객체에는 객체의 이름, 값 (편집 윈도우의 텍스트 등), 역할 (체크박스, 윈도우 등), 위치 (화면 좌표) 등과 같은 유용한 속성이 포함되어 있으며, 객체의 값을 변경하거나, 객체의 이벤트에 반응(포커스를 얻거나 값이 변경되는 등)과 같은 객체를 조작할 수 있는 유용한 메소드를 포함합니다.
많은 경우에 NVDA 객체는 IAccessible, JAB(Java Access Bridge), UIA(UI Automation)와 같은 접근성 API 관련 객체의 클래스에 속할 수 있으며, NVDA는 객체 클래스를 처리하는 방법을 제공합니다. 이러한 클래스는 NVDA 소스 코드의 NVDAObjects 디렉토리에 정의되어 있으며 해당 객체를 추가 기능에서 사용하려면 사용 중인 객체에 대한 적절한 객체 클래스 핸들러를 import합니다(예 :IAccessible 객체를 사용하여 작업 중이라면, NVDAObjects.IAccessible을 import합니다).
이러한 객체 클래스 중 가상 버퍼와 Tree Interceptor라는 특별한 객체가 있습니다. Tree Interceptor를 사용하면 NVDA가 트리 구조의 객체를 하나의 객체인 것처럼 작업할 수 있습니다. Tree Interceptor가 사용될 수 있는 경우는 NVDA가 PDF 문서, 웹페이지와 같은 복잡한 문서 작업을 할 수 있게 하는 가상 버퍼입니다. 이러한 객체에는 주어진 키보드 명령이 응용 프로그램에 전달되거나 NVDA에 의해 처리되는지 여부를 결정하거나 가상 커서를 통해 한 글자 명령을 사용하여 헤딩 간 이동과 같은 특수 메커니즘이 포함됩니다. 

객체를 계층적으로 검사하기

NVDA 객체 계층 구조를 검사하는 다양한 방법이 있습니다:
  1. 객체 탐색 명령 (NVDA + Numpad 2/4/5/6/8) 키 사용.
  2. NVDA 메뉴 -> 도구 -> Python Console을 사용하여 obj.next/previous/parent/firstChild/lastChild 메소드를 사용합니다. 객체에 사용 가능한 모든 속성을 보려면, 파이썬 콘솔에서 dir (objName)을 입력합니다. objName은 focus object(focus), navigator object(nav)와 같은 객체의 이름이며, nav, focus는 Python Console에서 사용할 수 있는 스냅샷 변수 중 일부입니다. Python Console에 대한 자세한 내용은 NVDA Developer Guide 문서 내 <5. NVDA Python Console> 섹션을 참고합니다.
또한, NVDA + F1을 눌러 로그 뷰어를 통해 현재 탐색 개체의 정보를 확인할 수 있습니다. 이 정보에는 객체의 이름, 값, 사용 중인 응용 프로그램의 이름 및 버전 정보 등이 포함됩니다.

초점 객체와 탐색 객체의 차이

초점 객체는 현재 초점을 받은 컨트롤입니다. 초점 객체는 키보드 포커스에 연결됩니다. 탐색 객체는 키보드 초점 여부와 상관없이 어디에서나 탐색할 수 있는 객체입니다. 추가 기능 개발 관점에서의 탐색 개체는 키보드 초점이 적용되어 있지 않은 프로그램에 대한 추가 기능을 개발하고자 할 때 탐색 객체를 통해 해당 프로그램의 상태를 검사할 수 있습니다. 예를 들어 제목 표시줄을 탐색 객체로 검사하는 동안 편집 필드에 초점을 유지할 수 있습니다.
추가 기능에서 초점 개체를 가져오려면 someObj = api.getFocusObject()를 입력합니다. someObj와 같은 변수의 이름은 다르게 지정할 수 있습니다. 변수의 이름을 지정할 때 myObj, focusObj와 같이 객체와 관련 있는 변수임을 알 수 있도록 지정하는 것이 좋습니다. 탐색 객체를 가져오려면, obj = api.getNavigatorObject()를 메소드를 사용하여 가져올 수 있습니다.

기타 유용한 객체 관련 기능 

다음은 NVDA 객체에서 사용할 수 있는 대표적인 메소드입니다. 각 메소드에 대한 자세한 사용법은 api.py 모듈에서 찾을 수 있습니다.
  • 전경 객체를 얻으려면(전경 창의 일부 하위 오브젝트를 검사하는 데 유용함) api.getForegroundObject() 메소드를 사용합니다. 전경 객체는 현재 초점을 받은 응용 프로그램에서의 최상위 객체이며, 전경 객체의 name 값은 일반적으로 NVDA에서 응용 프로그램의 제목으로 처리됩니다.
  • 객체에 포함된 자식 객체의 수 (예 : 자식 또는 전경 창의 위젯)을 보려면 obj.childCount 메소드를 사용합니다. 값이 0 이면 자식 개체가 더 이상 없음을 의미합니다.
  • 객체를 초점 객체 또는 탐색 객체로 설정하려면, api.setFocusObject(obj) 또는 api.setNavigatorObject(obj) 메소드를 사용합니다.
  • obj.property를 지정하여 객체의 다양한 속성을 검사할 수 있습니다. property는 obj.value(객체의 값), obj.name(객체의 이름), obj.state(객체의 상태), obj.role(객체의 역할) 등입니다. 열거한 속성들은 객체를 검사할 때 자주 사용되는 속성이기도 합니다.

입력 및 출력 : script, UI Message

이번 섹션에서는 사용자의 명령을 처리하고 추가 기능이 수행하는 작업을 음성이나 점자로 출력하거나 표시하기 위한 script 및 UI Message 요소에 대해 살펴보겠습니다. 
앱 모듈, 글로벌 플러그인 및 NVDA 객체는 키 누르기와 같은 특정 입력에 바인딩할 수 있는 특수 메서드를 정의할 수 있습니다. NVDA는 이러한 방법을 스크립트로 참조합니다. script는 사용자가 특정 명령을 수행할 때 실행되는 메소드입니다. 예를 들어, NVDA +T를 누르면 NVDA는 SayTitle(현재 활성화된 창의 제목 표시줄 읽기)라는 globalCommands 모듈에서 스크립트를 실행합니다. script는 다음의 두 가지 인수를 취합니다:
  • self: 스크립트가 호출된 App Module, Global Plugin 또는 NVDA Object 인스턴스에 대한 참조입니다.
  • gesture: 스크립트가 실행되는 입력을 나타내는 입력 동작 객체입니다.
gesture를 정의할 때 gesture를 식별할 수 있는 장치(키보드, 터치 스크린 등)의 접두어와 해당 gesture를 할당할 단축키(예: NVDA+shift+a)가 필요합니다. NVDA+shift+a 키에 script를 할당하려면, "kb:NVDA+shift+a"와 같이 입력합니다. script에 대한 자세한 예제는 다음 섹션에서 살펴봅니다.

script의 gesture에 사용할 수 있는 입력 장치는 다음과 같은 것들이 입습니다:
  • kb : 시스템 키보드 입력
  • br : 점자 디스플레이 컨트롤
  • TS : 터치스크린
  • bk : 점자 키보드 입력
ui 모듈을 사용하면 추가 기능이 수행하는 작업에 대해 음성으로 출력할 수 있습니다. 이 작업은 NVDA가 말할 수 있는 문자열로 대체되는 ui.message("출력 메시지 내용")를 사용하여 수행됩니다.

예제 1: script 메소드를 사용한 기본적인 예제

추가 기능 개발 가이드라인 2부에서 사용된 예제를 바탕으로 script를 할당하는 내용을 자세히 살펴보겠습니다. 2부와 달리 script 메소드 정의 방법이 변경되었습니다. 전체 예제 코드는 script 메소드 할당 예제 코드 다운로드에서 내려받을 수 있습니다.
class GlobalPlugin(globalPluginHandler.GlobalPlugin): # 글로벌 플러그인 제작을 위해 GlobalPlugin class 정의
@script(
description=_("ui.message 메소드로 음성으로 메시지를 출력합니다."),
gesture="kb:NVDA+leftArrow"
)
def script_outputMessage(self, gesture): # NVDA+Shift+A 키를 누르면 음성 메시지가 출력되는 함수
ui.message(u'안녕하세요. NVDA 추가 기능 개발 가이드라인의 첫 번째 예제입니다.') # ui.message 메소드로 음성 및 점자로 메시지 출력

예제 설명

추가 기능 개발 가이드라인 2부와 달리 script 메소드의 속성을 정의하는 방법이 변경되었습니다. NVDA 2018.3 버전부터 이러한 방식으로 Script 메소드를 정의하도록 권장하고 있습니다. 하지만, script 메소드를 정의하는 다양한 방법이 있으며, 2부에서 소개된 방법 또한 한 예입니다.
  1. Python의 Decorator로 Script 메소드를 정의합니다.
  2. description 속성은 script가 하는 일을 설명하는 데 사용됩니다. NVDA 메뉴 -> 설정 -> 제스처 설정에 description 속성으로 선언된 내용이 제스처의 설명으로 출력됩니다. description 속성을 정의하지 않으면 제스처 설정 목록에 나타나지 않아 사용자가 제스처가 어떤 일을 하는지 알 수 없고, 단축키를 변경할 수 없는 문제가 있습니다.
  3. gesture 정의의 경우 변경된 점은 없습니다. 위에서 열거한 다양한 입력장치: 단축키 형태로 정의합니다.

스크립트 실행 우선순위

App Module, Global Plugin과 같이 NVDA는 다양한 곳에서 script 메소드를 정의할 수 있습니다. Script 메소드를 정의할 때 script가 실행되는 우선순위를 알고 있어야 script의 충돌을 막을 수 있습니다. Script 메소드는 다음 우선순위로 실행됩니다:
  1. Global Plugin
  2. 사용자가 사용하는 앱 모듈.
  3. 다루고 있는 NVDA 객체.
  4. globalCommands.
예를 들어, NVDA+ Shift + Y 명령을 app 모듈 script에 할당하면 NVDA는 이 명령을 사용하는 글로벌 플러그인이 없으므로 해당 프로그램에서 script를 실행합니다. 그러나, 해당 명령을 사용하는 글로벌 플러그인이 설치되었다면 앱 모듈 script 대신 글로벌 플러그인의 script가 실행됩니다. 추가 기능을 개발할 때 이러한 script의 실행 우선순위를 알고 있는 것이 좋으며, 다음 사항을 기억하고 있다면 Script의 충돌을 방지할 수 있습니다.
  1. 키보드의 모든 키를 Script 명령의 일부로 사용할 수 있습니다(예 : Alt + NVDA + A~Z, 0~9 및 기타 구두점 포함). 그러나 명령 충돌을 피하려면 Control + 문자, Alt + Shift + 문자 등과 같은 많은 프로그램에서 사용할 수 있는 단축키의 사용을 최소화합니다.
  2. 키보드 단축키를 지정할 때 키보드 키 레이블은 대소문자를 구분하지 않습니다.
  3. NVDA 기능키 목록을 참조하여 사용하려는 단축키가 globalCommands에 정의되어 있는지 확인합니다. NVDA에서 사용되는 단축키와의 충돌을 최소화해야 합니다.

이벤트

초점 변경과 같은 특정 상황이 발생했을 때 NVDA가 비프음을 발생시키거나 음성으로 메시지를 출력하는 것과 같은 작업을 수행하도록 요청할 수 있습니다. 이러한 조건 또는 동작을 이벤트라고 합니다. 이벤트가 발생하면 NVDA는 다음을 수행합니다.
  1. 이벤트가 무엇인지 알아냅니다(예 : 체크박스에 초점이 있음).
  2. 이벤트에 대한 작업을 수행합니다(예 :체크박스에 이름과 상태 확인).
  3. 다른 객체가 이벤트와 연관된 액션을 가질 수 있도록 이벤트를 체인 아래로 전달합니다.
추가 기능에서 이벤트를 정의할 때 필요한 인자는 이벤트 이름(gainFocus 등), 추가 기능 모듈 (self), 이벤트를 할당할 객체(obj), nextHandler와 같이 정의하며, 이벤트 정의 코드의 기본적인 예는 다음과 같습니다:
def event_eventName(self, obj, nextHandler):
# 이벤트가 발생했을 때 할 일.
nextHandler()

예제 2: 컨트롤 이름이 변경될 때마다 사용자에게 알리기

2부에서 살펴본 이벤트 예제를 통해 이벤트에 대해 자세히 알아보겠습니다. 이벤트 예제 코드 다운로드
class GlobalPlugin(globalPluginHandler.GlobalPlugin): # 글로벌 플러그인 제작을 위해 GlobalPlugin class 정의
def event_gainFocus (self, obj, nextHandler): # 특정 컨트롤에 초점을 이동하면 발생하는 gainFocus 이벤트를 처리하기 위한 함수
obj = api.getFocusObject() # api 모듈의 초점을 받은 객체를 얻기 위한 함수
if (obj.name == u'네이버' and obj.role == controlTypes.ROLE_LINK): # 컨트롤의 이름이 네이버이고, 역할이 링크인 요소일 때 기능 실행
tones.beep(440,100) # 440HZ의 비프음 재생
nextHandler() # 비프음 재생 후 NVDA가 음성 출력 등과 같은 다음 기능이 처리될 수 있도록 함

예제에 대한 설명

  1. 이벤트를 정의하기 위해서는 event_eventName과 같이 선언합니다. 초점을 받았을 때 작업을 수행해야 하므로 gainFocus 이벤트를 사용합니다.
  2. Self는 추가 기능 또는 앱 모듈의 인스턴스이며, 링크 콘트롤에 이벤트가 발생하도록 하기 위해 obj 인자를 취하였습니다. 이벤트가 수행된 다음 작업을 위해 nextHandler를 선언했습니다.
  3. obj 인자는 초점 객체로 설정(api.getFocusObject)하고, 초점 객체의 이름이 네이버이고 객체의 역할이 링크에 초점이 있을 때 할 작업을 이벤트 블록 내 선언했습니다. 이벤트 블록 내 조건을 충족하면 올바른 이벤트 결과를 얻을 수 있습니다.
nextHandler를 올바른 위치에 선언하지 않을 경우 이벤트에 대한 작업이 처리된 다음 음성 출력과 같은 다음 작업이 바르게 처리되지 않을 수 있습니다. 다음은 이러한 상황을 보여주기 위한 코드입니다.
def event_loseFocus(self, obj, nextHandler): # 특정 컨트롤에서 초점을 잃었을 때 발생하는 loseFocus 이벤트를 처리하기 위한 함수
obj = api.getFocusObject() # API 모듈에서 현재 초점을 받은 객체를 얻기 위한 함수
if (obj.name == u'네이버' and obj.role == controlTypes.ROLE_LINK): # 컨트롤의 이름이 네이버이고, 역할이 링크인 요소일 때 기능 실행
tones.beep(880, 100) # 880HZ의 비프음 재생 
nextHandler() # nextHandler을 올바른 위치에 선언하지 않아 비프음 재생 후 NVDA가 음성 출력 등과 같은 다음 기능이 처리되지 않을 수 있습니다.
nextHandler를 올바른 위치에 선언하지 않아 이벤트 작업이 바르게 실행되지 않았습니다. 또한, 이벤트 작업이 수행된 다음 음성 출력, NVDA의 특정 키를 통해 사용자가 웹페이지 등을 탐색할 때에도 올바르게 수행되지 않습니다. 이러한 오동작을 막기 위해 이벤트를 발생시킬 객체, 이벤트가 발생하면 수행해야 할 작업에 대해 충분히 알고 있어야 합니다.
추가 기능에서 사용할 수 있는 이벤트 목록
이 섹션에서는 추가 기능에서 사용할 수 있는 이벤트 목록에 대해 살펴보겠습니다. 추가 기능에서 사용할 수 있는 대표적인 이벤트 목록은 다음과 같습니다:
  • gainFocus : 초점을 특정 컨트롤로 이동했거나 프로그램으로 전환했을 때 발생합니다.
  • loseFocus : 특정 컨트롤에서 초점을 벗어났거나, 프로그램에서 초점을 잃었을 때 발생합니다.
  • nameChange : 체크박스, 버튼과 같은 컨트롤의 이름이 변경되었을 때 발생합니다.
  • valueChange : 텍스트 필드의 텍스트, 슬라이더 컨트롤의 값이 변경되었을 때 발생합니다.
  • stateChange : 체크박스, 버튼 및 기타 컨트롤의 상태(선택 여부 등)가 변경되었을 때 발생합니다.
  • appModule_gainFocus : 사용자가 앱 모듈이 정의된 앱으로 전환했을 때 발생합니다. 특정 앱에 대한 터치 스크린 명령 추가, 앱의 현재 상태에 대한 추가 정보를 알릴 때 사용될 수 있습니다.
  • appModule_loseFocus : 사용자가 앱 모듈이 정의된 앱에서 초점을 벗어났을 때 발생합니다.
  • descriptionChange : 접근성 API에서 제공하는 컨트롤에 대한 설명이 변경되었을 때 발생합니다(이미지의 대체 텍스트 또는 title 속성으로 제공된 툴팁 등).
  • suggestionsOpened : 특정 글자를 입력했을 때 입력한 텍스트를 기반으로 결과를 제안할 수 있는 컨트롤에서 제한된 결과가 표시되면 발생합니다. 이러한 컨트롤은 Windows 10 에서의 시작 창 등에서 확인할 수 있습니다. NVDA가 이러한 컨트롤에서 suggestionsOpened 이벤트가 발생하면 사운드 재생을 통해 사용자에게 알립니다.
  • suggestionsClosed : suggestionsOpened와 반대로, 특정 글자를 입력했을 때 입력한 텍스트를 기반으로 결과를 제안할 수 있는 컨트롤에서 사용자가 제안된 결과에서 특정 항목을콘트롤 선택하거나, Escape 키 등을 눌러 제안된 결과를 입력하지 않고 닫은 경우 발생합니다. NVDA는 suggestionsClosed 이벤트가 발생하면 사운드 재생을 통해 사용자에게 알립니다.

추가 기능 개발에 필요한 유용한 모듈

객체, 스크립트 및 이벤트 외에도 추가 기능에 여러 모듈을 추가하여 개발할 수 있습니다. 예를 들어 Windows 레지스트리 액세스 (_winreg)와 같은 작업에 외부 모듈을 사용하거나, 고급 작업을 위해 Python의 내장 모듈 (time, functools 등)을 사용할 수도 있습니다. 다음은 NVDA에 내장된 대표적인 유용한 모듈 목록입니다:
  • NVDA 기본 API(api.py) : NVDA에서 사용되는 핵심 메소드 컬렉션으로 포커스 및 탐색 객체 가져오기, 포커스 설정, 클립보드에 텍스트 복사 등이 있습니다. api 모듈의 주요 메소드는 추가 기능 개발 가이드라인 2부에서 다루었습니다.
  • Global Plugin subsystem(globalPluginHandler.py) : 글로벌 플러그인을 제작하기 위해 필수적으로 요구되는 모듈이며, 플러그인의 초기화 등과 같은 주요 작업을 수행합니다.
  • app 모듈 하위 시스템(appModuleHandler.py, appModules) : 앱 모듈을 제작하기 위해 필수적으로 요구되는 모듈입니다.
  • 컨트롤 및 상태 컬렉션(controlTypes.py) : 컨트롤 유형 (역할) 및 컨트롤의 상태(컨트롤의 체크 여부 등)가 포함되어 있으며, 초점 및 탐색 객체의 컨트롤의 상태를 알아내는 등에 사용됩니다.
  • 이벤트(eventHandler.py) : 포커스를 얻는 등의 다양한 이벤트를 처리하기 위한 모듈입니다.
  • script 지원(scriptHandler.py) : 사용자가 키보드 명령 및 다른 입력을 눌러 실행된 script, 메소드를 처리합니다.
  • 음성 출력(speech.py) : 음성 출력을 제어하기 위한 다양한 메소드를 제공합니다.
  • 사용자 인터페이스 메시지(ui.py) : 음성 및 점자로 출력하기 위한 다양한 메소드를 제공합니다.
  • 톤 출력(tones.py) : 사용자가 비프음을 들을 수 있도록 합니다. 추가 기능 개발 시 디버깅을 위해 자주 사용될 수 있습니다.
  • IAccessible 지원 (IAccessibleHandler.py, IAccessible 개체) : Microsoft Active Accessibility (MSAA) / IAccessible 컨트롤을 지원하는 데 사용됩니다.
  • UIA 지원 (UIAHandler.py, UIA 객체): UIA (Microsoft UI Automation)) 컨트롤 (Windows 7 이상)을 지원하는 데 사용됩니다.
  • Java Access Bridge 지원 (JABHandler.py): Java 응용 프로그램에 사용되는 JAB 하위 시스템을 지원하는 데 사용되는 메소드 모음입니다.
  • 가상 버퍼 (virtualBuffers): 웹 사이트와 같은 가상 버퍼 문서를 처리합니다.
  • ARIA 지원 (aria.py): ARIA (Accessible Rich Internet Applications)에 대한 지원을 구현합니다.
  • 키보드 입력 (keyboardHandler.py): 키보드에서 명령을 입력하기 위한 메소드를 제공합니다.
  • 마우스 지원 (mouseHandler.py): 마우스 명령을 처리하기 위한 모듈입니다.
  • Global Commands 모음 (globalCommands.py): NVDA를 사용하는 동안 어디에서나 사용할 수 있는 Global Command 모음입니다.
  • 로깅 기능 (logHandler.py) : 모듈이 로그 뷰어를 통해 개발자 또는 사용자가 볼 수 있도록 로그를 쓸 수 있게 합니다. 추가 기능 개발 시 디버그 로그를 생성할 때 사용될 수 있습니다.

이 외에도 추가 기능이 객체의 텍스트에 접근할 수 있게 해주는 TextInfo 모듈은 줄, 단어 및 문자와 같은 다양한 방법으로 텍스트를 탐색하고 텍스트의 크기, 밑줄, 맞춤법 오류와 같은 서식 정보와 같은 텍스트의 특성을 검색할 수 있으며, 웹페이지 등에서 수학 콘텐츠에 접근할 수 있도록 해주는 mathPres 모듈, NVDA 및 추가 기능의 환경 설정을 관리하기 위한 ConfigObj , config 모듈과 같은 유용한 모듈이 있습니다.
추가 기능 개발 시 알아야 할 필수적인 팁
이제 추가 기능 개발의 기본적인 구성 요소에 대해 살펴보았습니다. 이번 아티클의 마지막 섹션에서는 추가 기능 개발 시 알아야 할 개발 프로세스 및 유용한 팁에 대해 살펴보겠습니다.
  1. NVDA 단축키, 개념 및 팁에 익숙해지는 것이 중요합니다. NVDA 사용자 메일링 그룹을 구독하여 NVDA에 대해 자세히 알아보고 NVDA가 작동하는 방식에 대해 이해하는 것이 중요합니다.
  2. 앱 모듈을 작성하는 소프트웨어에 대해 충분히 알고 있어야 합니다.
  3. 추가 기능을 작성할 때 코드를 정기적으로 테스트합니다. 사용자가 최소한의 오류로 추가 기능을 사용하도록 테스트하고 디버깅합니다.
  4. 추가 기능을 디버깅할 때 오타 또는 들여쓰기에 주의합니다. NVDA는 Python을 통해 추가 기능을 개발하므로 들여쓰기 문법에 익숙해져야 합니다.
  5. NVDA 핵심 코드 변경으로 인해 추가 기능이 작동하지 않을 수 있습니다. NVDA의 변경 이력 문서에서 '개발자용 변경 사항' 섹션을 읽고 추가 기능에 영향을 미칠 수 있는 코드 변경 사항을 최신으로 유지합니다. 개발자를 위한 변경사항은 한국어 번역으로 제공되지 않으므로 NVDA 변경 이력 영어판 문서의 <Changes for Developers 섹션에서 확인할 수 있습니다. NVDA 영어판 문서는 NVDA 설치 폴더(C:Program Files (x86)NVDAdocumentationen) 내 changes.html 에서 확인할 수 있습니다.

세 아티클에 걸쳐 추가 기능의 기본 개념 및 구성 요소에 대해 살펴보았습니다. 다음 아티클에서는 글로벌 플러그인 추가 기능을 작성하는 방법에 대해 살펴보겠습니다.

 

댓글 0
댓글을 작성하려면 해주세요.