0 votos

Modificación de las salidas de sonido con Applescript (parece que he extraviado mi grupo de pestañas)

Empiezo con la advertencia de que es la primera vez que publico, así que si incumplo la etiqueta, prometo que es por accidente; sólo tienes que decírmelo.

Estoy intentando hacer un AppleScript para cambiar la salida de sonido en mi Mac con un comando de voz (me he lesionado los brazos recientemente y he estado programando automatizaciones y atándolas al dictado). Y aunque he podido hacer que muchas cosas funcionen, he tenido problemas con esta.

Lo realmente frustrante es que, técnicamente, puedo hacer que funcione. He hecho el script de la siguiente manera:

tell application "System Preferences"
    reveal anchor "output" of pane id "com.apple.preference.sound"
end tell

tell application "System Events" to tell process "System Preferences"
    tell table 1 of scroll area 1 of tab group 1 of window 1
        select (row 1 where value of text field 1 is "Andrea Comm USB-SA Headset")
    end tell
end tell

quit application "System Preferences"

Puedo ejecutar esto, y cambiará mi salida de sonido a mis auriculares. El problema es que una vez hecho eso, no puedo cambiarlo a otra cosa hasta que lo haga manualmente. He duplicado literalmente el script y he sustituido el nombre de los auriculares por "headphones", pero cuando lo ejecuto, me dice que no puede obtener la pestaña uno del grupo 1. Incluso he hecho un completamente copia idéntica, una que también cambia la salida a los auriculares, y tenía exactamente el mismo problema.

Pero, si voy y reinicio manualmente la salida, puedo ejecutar este mismo script para cambiar a los auriculares, y funcionará. Entonces es el otro script el que no funcionará hasta que vuelva a cambiar manualmente la salida.

He buscado por todas partes y no encuentro una solución a este problema. Nadie más parece tener este problema, pero lo he tenido a través de múltiples scripts. Y aunque normalmente soy todo un copo de nieve especial, en este caso no me está ayudando.

Cualquier ayuda que pueda aportar sería genial. Muchas gracias.

0 votos

Escribí esto hace un tiempo - apple.stackexchange.com/a/218223/85275 - funciona con números de línea y no con nombres

0 votos

Ahh, se basó en una solución a un problema similar... repeat until exists tab group 1 of window "Sound" es la clave, creo apple.stackexchange.com/questions/209352/

0 votos

Me disculpo por haber tardado tanto en responder ¡La vida ha pasado! ¡Muchas gracias! Es un poco extraño que tenga que comprobar si algo existe, pero lo que sea hace el trabajo, ¿no? Te lo agradezco mucho :)

1voto

user3439894 Puntos 5883

Mientras que la otra respuesta de hecho funciona para mí en mi sistema que ejecuta MacOS High Sierra sin embargo, tengo que publicar una respuesta principio KISS.

Basta con añadir lo siguiente código a su actual código :

repeat until exists tab group 1 of window "Sound"
    delay 0.1
end repeat

Así que su código ahora se verá así:

tell application "System Preferences"
    reveal anchor "output" of pane id "com.apple.preference.sound"
end tell

tell application "System Events" to tell process "System Preferences"
    repeat until exists tab group 1 of window "Sound"
        delay 0.1
    end repeat
    tell table 1 of scroll area 1 of tab group 1 of window 1
        select (row 1 where value of text field 1 is "Andrea Comm USB-SA Headset")
    end tell
end tell

quit application "System Preferences"

Definitivamente hay un nivel de sofisticación en la otra respuesta; sin embargo, me imagino que puede ser un poco difícil de entender para aquellos que son nuevos en AppleScript y por qué un El principio KISS respuesta se está proporcionando.

0voto

qarma Puntos 71

He probado tu script en mi sistema ( Información del sistema: Versión de AppleScript: 2.7 Versión del sistema: 10.13.6), y ha funcionado perfectamente. Mi único pensamiento es un eco de la sugerencia de @tetsujin sobre la construcción de suficientes controles para asegurar que los elementos de la interfaz de usuario existe antes de tratar de hacer las cosas con ellos.

Puede ser que su sistema esté tardando más en cargar el Preferencias del sistema y su contenido y, por lo tanto, el script procede a ejecutar las siguientes líneas de código de forma prematura, lo que da lugar a un "can't get tab group 1" error.

Sin embargo, esto no explica satisfactoriamente por qué esto sucede en ejecuciones alternas de su script, lo cual suena muy extraño.

Volví a redactar tu script y utilicé mi formato personal y estandarizado que uso con todos estos Preferencia del sistema UI AppleScripts. Ha incorporado comprobaciones para evitar que el script continúe a menos que se confirme la existencia del elemento de interfaz de usuario en cuestión (deja de esperar después de un breve período y termina el scriptque regresa false mientras que cualquier ejecución exitosa del script devuelve true ).

use Prefs : application "System Preferences"
use sys : application "System Events"

property pane : a reference to pane id "com.apple.preference.sound"
property anchor : a reference to anchor "output" of my pane

property process : a reference to application process "System Preferences"
property window : a reference to window "Sound" of my process
property tab group : a reference to tab group 1 of my window
property scroll area : a reference to scroll area 1 of my tab group
property table : a reference to table 1 of my scroll area
property row : a reference to row 1 in my table

property Headphones : a reference to (my row where the value of ¬
    text field 1 = "Headphones")
property Headset : a reference to (my row where the value of ¬
    text field 1 contains "Andrea Comm")

on zzz(x, || as boolean)
    local x, ||

    repeat 20 times -- 20 x 0.2s = 4s max. wait
        if || = (x exists) then return true
        delay 0.2
    end repeat

    false
end zzz

on quit e as boolean
    continue quit Prefs
    return e
end quit

-- quit 1
-- if zzz(my process, no) = false then return quit 0

reveal my anchor
if zzz(my row, yes) = false then return quit 0

select Headset --OR: Headphones
-- quit 1

Hay tres líneas comentadas, que he numerado. Estas pueden permanecer comentadas durante la prueba del script, lo que asegurará la Preferencias del sistema permanece visible (una vez que la has puesto en primer plano manualmente), para que puedas ver físicamente si el dispositivo de salida está siendo seleccionado o no. Si el script parece ejecutarse correctamente, puedes eliminar las marcas de comentario y volver a poner en juego esas tres líneas, lo que permitirá Preferencias del sistema para permanecer oculto, fuera de la vista durante una ejecución normal del script, saliendo Preferencias del sistema al final.

En la penúltima línea se editará el nombre del dispositivo a seleccionar, ya sea Headphones o Headset (sin comillas), ambas declaradas como propiedades al inicio del script y que ya albergan las referencias apropiadas al elemento UI de su respectivo dispositivo.

0 votos

No me malinterpretes, me encanta el nivel de sofisticación que proporciona tu respuesta, pero es obvio que el OP es nuevo en AppleScript y por eso tuve que publicar un Principio KISS respuesta. Aunque ambas respuestas nos funcionan, no estamos seguros de cuál es la causa del otro problema (tener que seleccionar manualmente a posteriori...) que se menciona en el artículo.

0 votos

Muchas gracias por su ayuda. Esto está un poco por encima de mi nivel actual de comprensión, pero lo he copiado. Mantengo un archivo de cosas que he encontrado que no entiendo y al que vuelvo periódicamente. Es una gran sensación cuando puedo volver a uno y realmente analizarlo (por así decirlo). Muchas gracias.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X