El siguiente tutorial, realizado por Mauricio Haro, muestra el proceso de compra de los libros de formación disponibles en nuestra tienda.
Es válido para todos los libros, incluyendo formación básica de NVDA, Microsoft Word, Microsoft Outlook y los que estén disponibles en un futuro.
En el tutorial se usa un cupón de descuento. Sin embargo, si no hay cupones de descuento o se agotaron el proceso de compra es igual, excepto que no se debe insertar el código del cupón.

Pulsa este enlace para descargar el audiotutorial

Introducción

Windows y el resto de sistemas operativos, junto a la información e iconos por donde el usuario está navegando, agregan varios efectos visuales que indican, a las personas con vista, ciertas acciones realizadas. Además, en el caso que nos corresponde, Windows, hay vistas previas en carpetas con imágenes y videos que tienen una pequeña parte de ellos cuando vas pasando por los archivos. Todo esto suele ser prescindible para las personas con discapacidad visual y, a su vez, puede ralentizar al lector de pantalla en equipos con bajos recursos. Lo mismo puede pasar en clientes de correo electrónico y sus vistas previas al pasar por los mensajes, que marcan el mensaje como leído aunque el mismo lector todavía no nos lea el cuerpo.
Los efectos visuales, además, consumen cierta parte de los recursos. No suele afectar a los pc modernos de medias o altas prestaciones, pero si el pc es de bajos recursos, desactivarlos puede ayudar a mejorar el rendimiento, aunque para las personas videntes Windows se vea un poco feo. Puede ser, además, una ayuda también para ahorrar batería.
Ya que los usuarios ciegos totales no necesitamos estos efectos, aquí te explicaremos cómo desactivarlos.
¡Empecemos!

Efectos visuales en Windows

Si tienes Windows 10, un método es pulsar Windows+i para abrir configuración. Allí, pulsa tabulador hasta llegar a la lista de categorías, luego pulsa flecha derecha hasta accesibilidad y allí pulsa enter. Caerás en las opciones de visión, así que solo pulsa tabulador hasta llegar a los botones conmutadores Mostrar animaciones en Windows y Mostrar transparencia en Windows, desactiva ambas opciones con la barra espaciadora.
Existe otro método que vale para todas las versiones de Windows (basándonos desde Windows 7), es el siguiente:

  1. Pulsa Windows+R para abrir el diálogo ejecutar. Allí, escribe o pega SystemPropertiesComputerName y pulsa enter.
  2. Pulsa Control+tabulador hasta la pestaña opciones avanzadas.
  3. Pulsa el primer botón llamado configuración.
  4. En el nuevo diálogo para efectos visuales, hay un grupo de botones de opción. Allí, elije ajustar para obtener el mejor rendimiento, y para terminar pulsa aceptar en ambos diálogos.

Desactivar vista previa en el explorador de archivos

  1. Abre cualquier carpeta.
  2. Pulsa la tecla alt para ir a la barra de menús o la cinta.
  3. En Windows 7, ve al submenú herramientas y luego abre opciones de carpeta. En Windows 8 o 10, pulsa flecha izquierda para llegar a ficha archivo (si la cinta está minimizada el foco ya estará ahí al pulsar alt) y luego flecha abajo hasta cambiar opciones de carpeta y enter.
  4. Pulsa control+tabulador en el diálogo para ir a la pestaña ver. Allí, tabulador hasta llegar al árbol de casillas, pulsa flecha abajo hasta llegar a Mostrar controladores de vista previa en el panel de vista previa. Desactiva esa casilla y luego pulsa aceptar.

Microsoft Office

En cualquier programa de la suite Microsoft Office, por ejemplo Word, Excel o PowerPoint, sigue los siguientes pasos (nos basamos desde Office 2010 y superior):

  1. Pulsa la tecla alt para ir a la cinta.
  2. Pulsa flecha izquierda para ir al botón ficha archivo.
    Nota: Si la cinta está minimizada, el foco ya estará en el botón archivo al pulsar alt.
  3. Pulsa flecha abajo hasta llegar a opciones y pulsa enter.
  4. En este diálogo, elige la categoría avanzado. Ten en cuenta que si tienes Office 2016/365/2019, puedes alternar esto en la categoría accesibilidad.
  5. Allí solo pulsa tabulador hasta llegar a informar con animaciones o notificar con una animación. Pulsa espacio para desactivar la casilla. Si quieres llegar más rápido, debería funcionar el atajo alt+i (i latina).
  6. Pulsa enter para guardar los cambios.

En gestores de correo

Mozilla Thunderbird

En Mozilla Thunderbird es muy fácil. Solo pulsa f8 cuando estés en el programa para activar o desactivar la vista previa.

Microsoft Outlook

  1. Pulsa ALT para ir a la cinta.
  2. Pulsa flecha derecha hasta la pestaña vista.
  3. Pulsa flecha abajo para ir a las opciones (si la cinta está minimizada, pulsa enter).
  4. Pulsa control+flecha derecha hasta llegar al grupo diseño. Desplázate hasta panel de lectura con tabulador y desactívalo.

Aplicación correo en Windows 10

  1. Pulsa tabulador hasta llegar al botón configuración y actívalo.
  2. Desplázate hasta lista de mensajes.
  3. Cuando pulses enter en lista de mensajes aparecerán las opciones, así que solo desactiva las correspondientes a las vistas previas de los mensajes.

Conclusión

Si tu pc es de bajos recursos, puede que notes una cierta mejora en el rendimiento. Sin embargo, si tenemos un pc de medias o altas prestaciones también es bueno desactivarlos, ya que así le decimos a Windows, Office y los gestores de correo que no carguen las animaciones y vistas previas que son puramente visuales.
Esperamos que te haya servido.

Según Wikipedia, «Un proxy, o servidor proxy, en una red informática, es un servidor —programa o dispositivo—, que hace de intermediario en las peticiones de recursos que realiza un cliente (A) a otro servidor (C). Por ejemplo, si una hipotética máquina A solicita un recurso a C, lo hará mediante una petición a B, que a su vez trasladará la petición a C; de esta forma C no sabrá que la petición procedió originalmente de A. Esta situación estratégica de punto intermedio le permite ofrecer diversas funcionalidades: control de acceso, registro del tráfico, restricción a determinados tipos de tráfico, mejora de rendimiento, anonimato de la comunicación, caché web, etc. Dependiendo del contexto, la intermediación que realiza el proxy puede ser considerada por los usuarios, administradores o proveedores como legítima o delictiva y su uso es frecuentemente discutido.»
Viendo las funciones que ofrece un proxy, es normal que muchas empresas restrinjan el acceso directo a Internet y obliguen a sus empleados y clientes a utilizar uno. Muchos programas, especialmente los navegadores web más populares, permiten configurar un servidor proxy desde sus ajustes para utilizarlo al acceder a Internet. Otros, simplemente, utilizan los ajustes del proxy definidos en el sistema. Y algunos otros (cada vez menos, por suerte), no pueden trabajar con servidores proxy, con las limitaciones que ello implica. Llegados a este punto, podría surgirnos la siguiente pregunta.

¿Para qué podría NVDA necesitar un servidor proxy?

Aunque NVDA dista mucho de ser un programa que necesite una conexión a Internet para funcionar con normalidad, hay ciertas funciones (tanto integradas como presentes en complementos) que no podemos utilizar si no tenemos una conexión disponible. Por ejemplo:

  • La posibilidad de actualizar NVDA automáticamente desde el menú Ayuda.
  • La actualización de complementos mediante Add-on Updater.
  • La renovación o activación de licencias de ciertos complementos de pago (por ejemplo, Vocalizer).

¿Qué tipos de servidores se soportan?

Con la actualización de Python 2 a Python 3 en NVDA 2019.3, el soporte para servidores proxy ha mejorado notablemente. Sin tener que tocar una sola línea de código, NVDA soporta de forma nativa servidores http y https con autenticación básica. La autenticación es un factor determinante a la hora de usar un proxy corporativo, ya que es raro que soporten acceso anónimo. NVDA 2019.2 era capaz de usar servidores proxy, siempre que estos no solicitaran un nombre de usuario y contraseña.
Por desgracia, aún existen límites. Hasta que no se implemente una solución compatible, los servidores SOCKS4 y SOCKS5 no se pueden utilizar. Esto también nos limita al utilizar ciertos complementos que recurren a conexiones a bajo nivel, tales como NVDA Remote.
En este sencillo tutorial veremos cómo indicar a NVDA que utilice un servidor proxy, especificando usuario y contraseña si es necesario. Esta solución será válida para programas basados en Python que utilicen la biblioteca urllib y derivadas para acceder a la web. ¡Comencemos!

Definición de las variables de entorno

Indicar el proxy que debe utilizar NVDA es tan sencillo como definir un par de variables de entorno. Para llevar a cabo esta operación, no es necesario disponer de privilegios de administrador. Podemos modificar las variables de nuestra cuenta de usuario de Windows.
En primer lugar, abriremos el diálogo Variables de entorno. Esto se puede hacer de muchas formas, en las que no profundizaremos. Vamos a recurrir al diálogo Ejecutar:

  1. Pulsa windows+r para abrir el diálogo Ejecutar.
  2. Escribe o copia y pega el siguiente comando y pulsa intro: rundll32.exe sysdm.cpl,EditEnvironmentVariables

El diálogo muestra dos listas. En la primera se encuentran las variables de entorno del usuario, y en la segunda las del sistema. En este diálogo sólo podemos realizar acciones sobre las variables del usuario, más que suficiente para lo que necesitamos. Ahora, vamos a crear dos nuevas variables:

  1. Pulsa el botón «Nueva…».
  2. En nombre de la variable, escribe «HTTP_PROXY», todo en mayúsculas y sin las comillas.
  3. En valor de la variable, escribe la dirección completa del servidor proxy, siguiendo el esquema protocolo://usuario:contraseñ[email protected]:puerto, omitiendo, si es posible, las partes innecesarias. Por ejemplo:
    • Proxy sin autenticación: http://proxydeempresa.com:3128
    • Proxy con autenticación: http://usuario:contraseñ[email protected]:3128
    • Nota: en vez de http, la dirección podría usar los protocolos https, ftp u otros en algunos casos, o apuntar a alguna dirección interna después de especificar el puerto.
  4. Pulsa el botón Aceptar. La variable se habrá agregado a la primera lista.
  5. Repite los pasos anteriores para crear una nueva variable, pero en esta ocasión pon en el nombre «HTTPS_PROXY». Es posible que el valor de la variable sea el mismo o cambie, deberás consultarlo con los responsables de informática de tu organización.

Cuando hayas agregado ambas variables, pulsa el botón Aceptar para salir del diálogo y reinicia NVDA. Si todo ha ido bien, tu copia de NVDA se conectará a través del servidor proxy de tu organización y podrá descargar tanto actualizaciones de complementos, como del lector en sí mismo.

Original por Brian Vogel. Las cintas en Windows, ya sea en el explorador de archivos o en programas específicos como MS-Word y otros, sólo son otra variante de un sistema de menús que tiene por objetivo situar los elementos más comunmente utilizados «al frente y centrados» para agilizar el acceso. Continuar leyendo «Cómo usar las cintas ribbon con NVDA»

Os dejamos a continuación el listado de episodios, con sus títulos, sobre NVDA del podcast Ciberaprendiendo, de eiberoamerica.com, producidos por Gerardo Corripio y otros colaboradores. El sistema de protección de las descargas implantado en este sitio web impide que incluyamos enlaces directos a los mismos.

  • Episodio 419: Algunos Atajos básicos Similares entre NVDA y Jaws para aprender más rápido su uso
  • Episodio 416: Reseñando Complemento para NVDA Synth Ring Selector
  • Episodio 406: VLC Player con módulo para NVDA VLC Enhance Accessibility
  • Episodio 399: NVDA y sus módulos CalendarioReloj y Día de la Semana
  • Episodio 378: Lo más descatable, e interesante, en NVDA 2018.2
  • Episodio 351: Cambiando el idioma y voces a la velocidad de la luz con SwitchSynth para Nvda
  • Episodio 349: Eficientizando NVDA
  • Tutorial Nuevo Sobre NVDA Y AddOnWeatherPlus: episodios 220 y 301
  • Episodio 225: Seguimos Aprendiendo Diferentes Maneras De Navegar En Youtube Con Lectores De Pantalla
  • Episodio 204: Novedades Sobre NVDA 2015
  • Episodio 203: NVdA Navegando Por Internet
  • Tutorial sobre NVDA: episodios del 198 al 201
  • Gerardo Corripio Nos Explica El Uso Del Lector De Pantalla NVDA: episodios 15 y 18

Feliz escucha.

Este tutorial versa sobre la lectura de subtítulos automáticamente con NVDA usando el reproductor multimedia Pot Player. Está basado en la ponencia en el primer encuentro de usuarios y desarrolladores de NVDA en español de Carlos Esteban Martínez sobre el mismo tema, debido a que la ponencia no se ha podido conservar gravada por fallos técnicos (problemas serios de grabación).

INTRODUCCIÓN

Pot Player es un reproductor multimedia para Windows, y gratuito, desarrollado por una organización Coreana llamada Kakao. Posee:

  • La capacidad de reproducir muchos formatos de audio y vídeo con Codex incluidos
  • Funciones interesantes, como televisión analógica o digital, por mencionar algunas
  • Funciona desde Windows XP con Serviss Pack 3, obviamente, hasta Windows 10

Y… ¿qué tiene que ver esto con los subtítulos?
Pues la situación actual es que en cualquier reproductor multimedia los subtítulos se pueden leer por las personas videntes. Sin embargo, para nosotros, hablando específicamente de Windows, hay lugares donde quizá se puedan leer con el OCR, o cuando aparecen en texto en Netflix por ejemplo se pueden leer normalmente pero no automáticamente, lo que supone dar flecha abajo cada vez que cambian, y esto se suma a que si somos ciegos totales no sabemos cuándo cambian automáticamente sin ayuda visual.
Pues bien, esto va avanzando. Y ahora, los desarrolladores de Pot Player han pensado en nosotros, y han puesto la capacidad de que podamos leer los subtítulos automáticamente con cualquier sintetizador de voz que sea sapi 5, o algo más interesante: Convertirlos en títulos de ventanas, ¡para que sean leídos por los lectores de pantalla! NVDA soporta muy bien cambios en el título de ventanas para decirlos automáticamente cuando están enfocados, ¡por lo que esto funciona!
Nota: En este tutorial, nos centraremos en cómo lograr leer automáticamente los subtítulos con NVDA. Si alguien desea utilizar Pot Player como reproductor predeterminado, por ejemplo, es algo muy fácil, e incluso en los menús se encuentran los atajos de los controles de reproducción y demás. De hecho, voy informando que Pot Player tiene por ejemplo efectos de audio para normalizar el volumen cuando está muy bajo en el audio original y esas cosas, además de efectos de vídeo, por lo tanto la calidad de sonido y vídeo en Pot Player es muy buena.

DESCARGA E INSTALACIÓN

Para descargar el programa:

  1. En cualquier navegador, nos dirigimos al siguiente sitio web:

https://daumpotplayer.com/

  1. En el menú de la página, buscamos el enlace DOWNLOAD y lo abrimos.
  2. Cuando se cargue la página, pulsa la H (con NVDA) para saltar al encabezado DOWNLOAD. Aquí tienes los enlaces para descargar la versión de 32 o 64 bits; descarga la correspondiente a la arquitectura de tu Windows, y si no la sabes, hay varias formas de saberla, entre ellas el complemento Resource Monitor (para NVDA) y el comando NVDA+Shift+6, desde sistema (panel de control de Windows), etc. Al pulsar alguno de estos enlaces simplemente ya inicia la descarga.

Una vez descargado, la instalación es estándar y no supone ningún problema.

Atención: Después de elegir qué componentes instalar, al pulsar siguiente, el programa dará una oferta de instalar cierto antivirus. Si no se desea tener problemas con el hecho de tener un antivirus no muy accesible instalado se recomienda darle al botón declinar. Será necesario ser cuidadosos en relación con la opción de pulsar aceptar en esa parte.

Nota sobre actualizaciones del programa usando los lectores de pantalla: Cuando aparezca una actualización disponible y el programa nos muestre el diálogo respectivo, tenemos que tener cuidado de no pasarnos de los botones con tab, porque si no Shift+tab no funciona y tab tampoco. Lo que hay que hacer con NVDA si esto ocurre, es usar el navegador de objetos.
Si no sabes usarlo tienes información en la guía del usuario de NVDA, en tutoriales, etc.

PRIMEROS PASOS

Cuando ejecutemos el programa, NVDA simplemente dirá Pot Player. Hay que tener en cuenta que a los menús no se accede con ALT, sino con la tecla aplicaciones, o si el teclado no tiene tecla aplicaciones, shift+f10.
Al pulsar esta tecla, se nos muestran los menús típicos de un reproductor multimedia, con opciones tales como: Abrir archivo, un submenú para abrir varias cosas (archivos, carpetas, URL, etc), álbum/favoritos, cerrar reproducción (al pulsar espacio para reanudar continúa la reproducción del último archivo si este no se movió/eliminó incluso después de cerrar el programa y volverlo a abrir), y otros submenús para la apariencia visual, efectos y filtros de audio y vídeo, etc.

Nota: En la última versión de este reproductor, de forma predeterminada el menú no se abre con tecla aplicaciones o shift+f10, que era el comportamiento en las versiones anteriores. Sin embargo, esto se puede solucionar de la siguiente forma:

 

  1. Pulsa f5 para acceder a las preferencias.

 

  1. En la vista en árbol, expande la categoría general y busca temas.

 

  1. Pulsa tabulador hasta el cuadro combinado seleccionar menú. En este punto, pulsa flecha abajo hasta predeterminado del sistema (o system default). Acontinuación pulsa el botón aceptar, y el menú del programa será accesible de nuevo, pudiéndose acceder a él con tecla aplicaciones o shift+f10.

CÓMO CONFIGURAR LA LECTURA DE SUBTÍTULOS

La opción que nos interesa del menú principal es preferencias, que se abre también con el atajo f5.
Tenemos varias categorías tales como general, configuraciones con respecto a los atajos de teclado, la reproducción, efectos de audio y vídeo, apariencia visual, etc. Puedes explorar todo esto.
La categoría a la que tenemos que acceder en el árbol es Accesibilidad.
Las primeras casillas que se encuentran pulsando tabulador activan la lectura de mensajes del programa, subtítulos e información al pasar el ratón encima, pero con voces sapi 5. Luego aparecen las opciones para configurar la voz, y, si solo quieres que NVDA lea los subtítulos, no necesitas activar las primeras casillas. Lo que nos interesa, es Mostrar mensajes en pantalla como títulos de ventanas, para que NVDA lea automáticamente mensajes que va poniendo el programa por ejemplo cuando se realizan ciertas acciones, por ejemplo, lo que nos cubre aquí (Mostrar los subtítulos de texto como títulos de ventana) para que NVDA lea automáticamente los subtítulos, y Aparece las herramientas al pasar el ratón por encima del tema como títulos de v… Bueno, dice ventana pero incompleto. Se deben marcar estas casillas y aceptar.

Lectura de subtítulos

Hay que tener en cuenta que para poder hacer esto, necesitamos tener los subtítulos aparte. Estos son los formatos de subtítulos soportados por Pot Player:
*.smi; *.srt; *.idx; *.sub; *.sup; *.psb; *.ssa; *.ass; *.txt; *.usf; *.xss; *.ssf; *.rt; *.lrc; *.sbv; *.vtt; *.ttml
Se pueden encontrar muchísimos subtítulos en estos formatos buscando en Internet. Hay páginas específicas que permiten descargarlos.
Una vez tengamos los que queramos, aremos lo siguiente:

  • Con Pot Player abierto o desde el explorador de archivos, buscamos la película/serie/ánime y lo abrimos. Hay que tener en cuenta que, como los subtítulos van aparte, no importa si es audio o vídeo.
  • Luego, pausamos la reproducción con barra espaciadora y nos vamos al menú abrir, cargar/añadir subtítulo, o bien ejecutamos la misma opción desde el menú subtítulos.
  • buscamos el subtítulo y lo abrimos. Ahora pulsaremos espacio para continuar la reproducción, ¡y notaremos que ahora nos lee los subtítulos NVDA!

Nota: Pensaba que se debe tener marcada la opción anunciar cambios en el contenido dinámico sí o sí, pero me he dado cuenta que esto no afecta a esta opción, por lo que con la opción desactivada los sigue leyendo al menos que desmarquemos la casilla para que Pot Player los muestre como títulos de ventana.

SINCRONIZACIÓN

Sin embargo, eso no es todo.
Dependiendo del subtítulo, a veces puede de sincronizarse con la reproducción (dependiendo en dónde comienza el subtítulo y en dónde paramos la reproducción) y hay que lograr sincronizarlo, para que no se lean muy adelantados o muy atrasados. Esto está en el menú subtítulo, en el submenú de la sincronización. Hay varias opciones de velocidad, así que hay que ir probando hasta llegar a la que más se acomode a la reproducción. Nota: Paciencia, sincronizar es algo complicado.
También hay que tener en cuenta que… ¡ también se pueden leer los subtítulos de los dvd’s de esta forma! Con el DVD ya insertado en la unidad, ejecutamos abrir DVD en el menú abrir de Pot Player. Luego, simplemente configuramos los subtítulos en sus respectivos menús, con ayuda visual, aunque también podríamos acceder a ellos con el OCR de NVDA (y si tenemos Windows10 es más fácil que con el complemento OCR).

NOTA SOBRE SUBTÍTULOS DEL TEXTO DENTRO DE UN vídeo

En Youtube, por ejemplo, dependiendo del vídeo, algunos subtítulos del texto se podrán leer. Para esto se descarga el vídeo y como formato de vídeo, o se abre pegando el enlace desde la opción abrir URL (dependiendo de nuestra conecsión a internet esto no siempre funciona por el tiempo de espera), y en el menú subtítulos tener activada la opción subtítulos de texto dentro del vídeo. Nota: Al abrir URL de vídeo con subtítulos de Youtube hay que tener marcada la casilla mostrar con subtítulos, para que estos aparezcan.

TRADUCCIÓN DE SUBTÍTULOS, IDIOMA, ETC

Desde el menú subtítulos también podremos traducir subtítulos que estén en otro idioma, aunque esto utiliza el traductor de Google y por lo tanto dramáticamente puede no traducir bien. También podremos seleccionar el idioma en el caso de un DVD.

CONCLUSIÓN

La lectura de subtítulos automática para nosotros era difícil, pero en los diferentes sistemas operativos esto se está logrando, por lo que ahora se puede resolver sin necesidad de que una persona vidente los esté leyendo o sin tener que estar pulsando flecha abajo de forma incómoda mientras se ve una película o serie, por ejemplo.
¡Esperamos que esto te haya sido útil!

Aquí te presentamos un videotutorial sobre el navegador de objetos, modos de revisión, OCR (el complemento) con el cursor de revisión y el complemento Obj Pad, que fazilita la navegación por objetos con modos para las teclas de flechas.
Haz clic en este enlace para ver el tutorial.
Notas:
Este tutorial fue realizado en marzo del 2017. Por lo tanto, NVDA todabía no funcionava con el OCR de Windows 10, así que aquí te mostramos de forma vrebe cómo utilizarlo. Si tienes una versión inferior a Windows 10, utiliza el complemento OCR que se usa en el tutorial.
Pasos:

  • Coloca el nabegador de objetos sobre la imagen que deseas reconocer.
  • Pulsa NVDA+R. Si el ocr de Windows 10 está disponible y si el objeto se puede reconocer, NVDA dirá reconociendo y mostrará el resultado en un documento con modo exploración, de tal forma que puedes leer el documento como si de cualquier documento en modo exploración se tratase y utilizar espacio o enter para activar (si es posible) un clic en alguna parte del texto (ejemplo, activar una opción en una aplicación).

En este tutorial, se trabaja con los comandos de la distrivución de teclado sobremesa o escritorio. Te recomendamos ver la Referencia rápida de órdenes para ver los jestos de la distrivución portátil, así como los jestos táctiles para equipos con pantalla táctil y Windows 8 o superior.
Este tutorial ha sido realizado por un colaborador de la comunidad de tiflojuegos.com conocido como Civerbadnnes, ya que esto llega a servir en algunos videojuegos para algo de accesibilidad.
¡Esperamos que sea útil!

En esta entrada te presentamos Tifloaudio, un podcast creado por Manolo Álvarez. En él, entre muchas otras curiosidades y tecnologías específicas para personas ciegas, se habla de NVDA. Escuchando en orden los episodios que te mostramos a continuación, harás un recorrido histórico por este lector de pantalla, desde que comenzó a ser un poco más conocido allá por el 2009 hasta la actualidad. Podrás ver su evolución, así como conocer en profundidad cómo funcionan algunas de sus características. Pulsando cada enlace, se abrirá la entrada correspondiente al episodio seleccionado en la web de Tifloaudio. Si estás preparado, ¡allá vamos!
Tiflo Audio 7: Demostración de NVDA
Tiflo Audio 55: Cambiar voces en el lector de pantalla NVDA
Tiflo Audio 70 – Utilizar Windows 10 con el lector de pantalla NVDA y una línea braille
Tiflo Audio 82 – Demostración novedades NVDA 2017.3: Nuevas voces Windows OneCore, Reconocimiento de textos OCR y entradas con líneas braille
Tiflo Audio 94 – Nuevos comandos para líneas braille con el lector de pantalla NVDA 2018
¡Esperamos que los disfrutes!

En este episodio, que ya tiene algún tiempo, se hace una introducción y se resuelven dudas comunes a la hora de dar el paso de Jaws a NVDA. No ha cambiado gran cosa desde que se publicó, salvo el nuevo diálogo de opciones. En él participan José María Ortiz, Daniel Montalvo, Juan Buño y José Manuel Delicado.
Visita la entrada con el episodio en la web de José María Ortiz
¡Que lo disfrutes!

A la hora de programar un complemento que tiene algún tipo de interfaz gráfica, o hacer modificaciones a la propia interfaz de NVDA, todos los desarrolladores ciegos nos hacemos la misma pregunta tarde o temprano: ¿cómo se ve en pantalla esto que estoy programando? Podemos probar distintas combinaciones de constantes, posiciones y tamaños para los controles, pero al no poder verlos, probablemente el resultado no sea el que esperamos. En la entrada de hoy vamos a hablar del módulo guiHelper, disponible desde la versión 2016.4 de NVDA. La misión de este módulo es abstraernos un poco de los detalles más visuales del diseño de nuestra interfaz, de tal forma que sólo debamos preocuparnos de añadir controles y funcionalidad. El módulo no hace magia, pero nuestras interfaces quedarán probablemente un poquito mejor que antes. Si quieres conocer este módulo un poco más, sigue leyendo. ¡Allá vamos!
Nota: en este artículo se asume que el lector tiene conocimientos sobre la programación de complementos con interfaz gráfica.

Importar el módulo

El módulo guiHelper se encuentra en el paquete gui. Si nuestro complemento tiene interfaz gráfica, en algún momento seguramente habremos importado los módulos gui y wx, por lo que sólo haría falta escribir esto:
from gui import guiHelper
Una vez hecho esto, ya podremos acceder a sus constantes, funciones y clases.

Constantes de guiHelper

Estas constantes vienen incluidas directamente en el módulo.

  • BORDER_FOR_DIALOGS: es el borde que se encuentra alrededor de cada control dentro de un diálogo.
  • SPACE_BETWEEN_VERTICAL_DIALOG_ITEMS: cuando los elementos de un diálogo se disponen de manera vertical, esta constante se puede emplear para indicar cuánto espacio hay entre cada elemento.
  • SPACE_BETWEEN_BUTTONS_HORIZONTAL: especifica el espacio que hay entre botones dispuestos de manera horizontal.
  • SPACE_BETWEEN_BUTTONS_VERTICAL: igual que en el caso anterior, pero se aplica cuando los botones están dispuestos verticalmente unos sobre otros.
  • SPACE_BETWEEN_ASSOCIATED_CONTROL_HORIZONTAL: es el espacio que separa a dos controles relacionados dispuestos en horizontal.
  • SPACE_BETWEEN_ASSOCIATED_CONTROL_VERTICAL: lo mismo que en el caso anterior, pero en disposiciones verticales.

Funciones de guiHelper

A día de hoy, guiHelper sólo dispone de una función a nivel de módulo: associateElements. Esta función introduce dos controles en un objeto Sizer de wx, situándolos en horizontal o vertical y separándolos adecuadamente según su tipo. Su cabecera es la siguiente:
def associateElements( firstElement, secondElement)
Los controles deben pasarse en el orden en que queremos que se asocien. Las posibles asociaciones son:

  • wx.StaticText y wx.Choice, wx.TextCtrl o wx.Button: asocia una etiqueta con un cuadro combinado, un cuadro de edición o un botón, en disposición horizontal.
  • wx.StaticText y wx.ListCtrl o wx.ListBox o wx.TreeCtrl: asocia una etiqueta con una presentación en lista, un cuadro de lista o una vista en árbol, en disposición vertical.
  • wx.Button y wx.CheckBox: asocia un botón y una casilla de verificación, disposición horizontal.
  • wx.TextCtrl y wx.Button: asocia un cuadro de texto y un botón en posición horizontal.

En todos los casos, los controles deben ser objetos ya instanciados. La función devuelve el objeto Sizer que los contiene, listo para añadirlo a un diálogo u otro Sizer.

Clases de guiHelper

El módulo guiHelper dispone de cuatro clases que nos ayudan a construir nuestra interfaz. Aunque vamos a verlas todas, la que más se usa es BoxSizerHelper. Todas ellas tienen el atributo sizer, empleado al construir el resto de la interfaz.

La clase ButtonHelper

Esta clase sirve para añadir el espacio adecuado entre botones, tanto en horizontal como en vertical. Al instanciar objetos a partir de ella, se debe especificar la orientación del Sizer que va a generar, ya sea wx.VERTICAL o wx.HORIZONTAL. Por ejemplo:
bh=guiHelper.ButtonHelper(wx.VERTICAL)
Una vez construido el objeto, podemos agregar botones llamando al método addButton:
bh.addButton(mydialog, label=_("Test button 1"))
El método addButton construye un nuevo botón con los parámetros que le pasemos, o también puede añadir un botón previamente creado. Es imprescindible indicar en el primer caso el diálogo o ventana padre que contendrá al botón, y una etiqueta por razones de accesibilidad con el parámetro label. Al acabar, se devuelve el botón creado para que podamos hacer cosas con él, como asociarle acciones.

La clase LabeledControlHelper

Esta clase permite crear controles etiquetados y asociar etiqueta y control entre sí en un Sizer. Se apoya en la función associateElements que vimos más arriba. La cabecera de su constructor es:
def __init__(self, parent, labelText, wxCtrlClass, **kwargs)
Por lo tanto, para construir un objeto de tipo LabeledControlHelper necesitamos pasar como parámetros el diálogo o ventana padre, el texto de la etiqueta que acompañará al control, la clase del control (cuidado, aquí no valen controles previamente creados), y cualquier argumento que necesite el control para construirse. Veámoslo de forma más clara con un ejemplo:
lch=guiHelper.LabeledControlHelper(mydialog, "Selecciona una fruta", wx.Choice, choices=['pera', 'manzana', 'fresa'])
En el ejemplo anterior hemos pasado como clase wx.Choice para crear un cuadro combinado, y como parámetros adicionales las opciones que presentará.
La clase LabeledControlHelper dispone de dos atributos para que podamos trabajar cómodamente: sizer, igual que en el resto de clases, y control, que hace referencia al control de wx que hemos creado.

La clase PathSelectionHelper

Esta clase nos permite crear de una forma rápida, sencilla y abstrayéndonos de todos los detalles, un cuadro de edición y un botón «Examinar…» como los que aparecen en muchos programas, con el objetivo de que podamos fabricar un selector de rutas. En el constructor le pasamos el padre, como siempre, el texto del botón Examinar, y el título del diálogo que se desplegará para seleccionar una ruta cuando pulsemos dicho botón. Por ejemplo:
psh=guiHelper.PathSelectionHelper(mydialog, "Examinar...", "Selecciona la carpeta que contiene los documentos")
Como en los casos anteriores, tenemos la propiedad sizer, pero además aquí nos acompaña otra: pathControl, que contiene una referencia al cuadro de texto donde está escrita la ruta.
En caso de que sea necesario, se podría crear una clase que herede de esta y sobreescribir o extender los métodos getDefaultBrowseForDirectoryPath y onBrowseForDirectory. El primero devuelve la ruta por defecto que muestra el diálogo de seleccionar carpeta, y el segundo muestra este diálogo y almacena el resultado en el cuadro de edición.

La clase BoxSizerHelper

Llegamos a la clase más importante de este módulo, la más usada, y la que emplea la funcionalidad expuesta en casi todas las otras. BoxSizerHelper permite configurar la disposición interna de un objeto Sizer. La cabecera de su constructor es:
def __init__(self, parent, orientation=None, sizer=None)
Como siempre, el primer argumento que espera recibir es la ventana padre. Después, podemos pasar una orientación (wx.VERTICAL o wx.HORIZONTAL), en cuyo caso se creará internamente un objeto Sizer, o un Sizer ya creado, a ser posible vacío. Si pasamos ambos parámetros, se produce un error.
Al igual que sucede en los casos anteriores, tenemos un atributo sizer. Esta clase, además, presenta los siguientes métodos:

  • addItem(self, item, **keywordArgs): añade un control wx ya creado y lo sitúa adecuadamente. El último argumento es opcional y sólo se usa en raras ocasiones. El método devuelve el elemento que se pasa como parámetro, para que podamos asociarle acciones y hacer otras cosas con él.
  • addLabeledControl(self, labelText, wxCtrlClass, **kwargs): añade un control etiquetado. El primer parámetro que recibe es el texto con la etiqueta del control, seguido de la clase del control y los parámetros adicionales que se quieran pasar. Fíjate en el ejemplo anterior del cuadro combinado. Este método devuelve el control que se acaba de agregar.
  • addDialogDismissButtons(self, buttons): agrega y alinea los botones Aceptar, Cancelar y Aplicar de los diálogos estándar. Este método debería llamarse cuando ya se han añadido todos los demás controles. Buttons puede ser un objeto wx.Button, un objeto wx.Sizer o un objeto guiHelper.ButtonHelper. Devuelve el mismo objeto que se le pasa como parámetro.

Aplicaciones prácticas

Al igual que en una entrada anterior, vamos a poner como ejemplo el complemento Enhanced Aria (aunque esta vez no vendrá solo), para demostrar lo fácil que es adaptar nuestros complementos para que se apoyen en guiHelper. En la versión 1.3, para agregar la primera casilla de verificación del diálogo de ajustes de aria mejorada, se hacía esto:
self.bannerenabled=wx.CheckBox(self, wx.NewId(), label=(u"Report banners")) # Como self es una clase que hereda de wx.Dialog, se pasa como padre
self.bannerenabled.SetValue(config.conf['aria']['reportBanner']) # Se establece el valor de la casilla

sizer.Add(self.bannerenabled,border=10,flag=wx.BOTTOM) # se añade la casilla sizer
Como se puede comprobar, hay que crear la casilla con su etiqueta correspondiente, asignarle el valor adecuado y añadirla al objeto que va a contenerla, con indicadores de borde y alineación. Sin embargo, en la versión 2.0 basta con hacer esto:
def createSettings(obj, sizer):
helper=guiHelper.BoxSizerHelper(obj, sizer=sizer)
obj.bannerenabled=helper.addItem(wx.CheckBox(obj, wx.NewId(), label=
("Report banners")))
obj.bannerenabled.SetValue(config.conf['aria']['reportBanner'])

Como se puede ver, creamos un BoxSizerHelper pasando como parámetro el Sizer que nos dan en el método makeSettings, y que en el caso particular de esta implementación se pasa a createSettings. A continuación, agregamos una nueva casilla de verificación llamando a addItem, y luego establecemos su valor.
Veamos el diálogo de Windows 10 App Essentials, que también se apoya en este módulo. Lo podemos encontrar en el archivo w10config.py. Se trata de un diálogo completo, una clase que hereda de wx.Dialog. Por lo tanto, construirlo implica más esfuerzo, al no tener a nuestra disposición la clase SettingsDialog de NVDA o la clase SettingsPanel. En lugar del método makeSettings, que ya nos da un Sizer, las operaciones de construcción se hacen en el constructor del diálogo.
En primer lugar, se crea un objeto de tipo BoxSizer:
mainSizer = wx.BoxSizer(wx.VERTICAL)
Y a continuación, se crea un BoxSizerHelper con un Sizer nuevo, que será hijo del que se acaba de crear:
w10Helper = gui.guiHelper.BoxSizerHelper(self, orientation=wx.VERTICAL)
Teniendo el BoxSizerHelper, ya se pueden añadir controles. Vamos a ver dos de ellos, la casilla de verificación y el cuadro combinado.
self.autoUpdateCheckbox=w10Helper.addItem(wx.CheckBox(self,label=_("Automatically check for add-on &updates"))) # Se crea la casilla
self.autoUpdateCheckbox.SetValue(config.conf["wintenApps"]["autoUpdateCheck"]) # Se establece su valor
labelText = _("&Add-on update channel:") # Etiqueta del cuadro combinado
self.channels=w10Helper.addLabeledControl(labelText, wx.Choice, choices=["development", "stable"]) # Cuadro combinado

Ya para acabar, se añaden los botones Aceptar y cancelar, y se hace de una forma muy particular, ya predefinida en wx:
w10Helper.addDialogDismissButtons(self.CreateButtonSizer(wx.OK | wx.CANCEL))
En este caso no existe acceso directo a los botones, como sí pasa con el resto de los controles, así que las asociaciones se hacen de esta manera:
self.Bind(wx.EVT_BUTTON, self.onOk, id=wx.ID_OK)
self.Bind(wx.EVT_BUTTON, self.onCancel, id=wx.ID_CANCEL)

El BoxSizerHelper ya está completo, hay que añadirlo al Sizer principal. Una vez más, se pide ayuda a guiHelper, y al propio motor wx para centrarlo y posicionarlo:
mainSizer.Add(w10Helper.sizer, border=gui.guiHelper.BORDER_FOR_DIALOGS, flag=wx.ALL)
mainSizer.Fit(self)
self.Center(wx.BOTH | (wx.CENTER_ON_SCREEN if hasattr(wx, "CENTER_ON_SCREEN") else 2))

Conclusión

Es importante que nuestros complementos e interfaces gráficas en general sean visualmente usables. Aunque NVDA es un lector de pantalla empleado mayoritariamente por personas con discapacidad visual, estas personas suelen estar acompañadas por otras que ven perfectamente, especialmente cuando se introducen en el mundo de la informática. Por tanto, debemos tener en cuenta a todos los posibles usuarios.
En esta entrada hemos conocido el módulo guiHelper, que nos ayuda precisamente en esta tarea. GuiHelper no hace magia, no tiene ningún tipo de «inteligencia artificial» que coloque nuestros controles exactamente como deberían estar para que nuestra interfaz sea atractiva. Sin embargo, nos ayuda un poco a conseguirlo, simplifica nuestro código y por lo tanto facilita el mantenimiento.
Si tus complementos no se apoyan todavía en este módulo, no esperes más para adaptarlos. Tus usuarios lo agradecerán, ¡y tú también!