6 votos

Error en la barra de progreso de AppleScript: ¿Cómo evitar que el diálogo de progreso permanezca?

El bicho:

Cuando la función de AppleScript diálogo de progreso es sucedido por un diálogo, el diálogo de progreso aún persiste -aunque todos los pasos de progreso se hayan completado, y la barra de progreso esté llena. Permanecerá hasta que el script haya sido cancelado, hasta que el script haya finalizado, o hasta que no existan más diálogos en el script.

Este error no puede ser presenciado mientras se ejecuta el código desde dentro de script Editor.app, porque, en script Editor, no aparecerá un diálogo de progreso. En su lugar, se integra un medidor de progreso en forma de tarta en la parte inferior de la ventana script.


Cómo reproducir el error:

Guarde el siguiente AppleScript código como un archivo .app:

(El archivo debe ser un archivo .app, ya que los archivos .scpt no pueden mostrar diálogos de progreso).

set n to 5

set progress total steps to n
set progress description to "Script Progress"
set progress additional description to "Additional description"

repeat with i from 1 to n
    delay 0.1
    set progress completed steps to i
end repeat

display dialog "The progress dialog should be gone at this point."

Al iniciar la aplicación, verás lo siguiente:


La pregunta:

¿Existe una solución para forzar el cierre del diálogo de progreso una vez completado, de modo que se puedan colocar diálogos adicionales después del diálogo de progreso, sin que éste siga siendo visible?


Lo que he probado:

He intentado abordar el problema interpretando el diálogo de progreso simplemente como una "ventana" de la aplicación.

Si ejecuta el siguiente código en un archivo AppleScript separado, mientras ambos diálogos de ProgressBarTest.app están en pantalla (como en la captura de pantalla anterior):

tell application "System Events"
    set allWindows to name of window of processes whose visible is true
end tell 

return allWindows

aprenderá que ProgressBarTest.app tiene 2 "ventanas" abiertas. Los títulos de estas ventanas son:

{"", "ProgressBarTest.app"}

La primera ventana de esta lista se refiere al display dialog diálogo. La segunda ventana de esta lista, titulada ProgressBarTest.app es el diálogo de progreso.

Luego intenté cerrar esta "ventana" de diálogo de progreso utilizando AppleScript (como se puede hacer para cualquier ventana de aplicación estándar). Pero, el siguiente código:

tell application "System Events" to tell process "ProgressBarTest.app"
    if exists window "ProgressBarTest.app" then
        close window "ProgressBarTest.app"
    end if
end tell

dará un error al usuario. El texto de este diálogo de error es:

script Error

Los eventos del sistema tienen un error: la ventana "ProgressBarTest.app" del proceso "ProgressBarTest.app" no entiende el mensaje de "cierre".

Pronto me di cuenta de que, si tu pantalla tiene el mismo punto de vista que la de la captura de pantalla anterior, entonces no puedes ni siquiera cerrar manualmente el diálogo de progreso. Esto se debe a que el display dialog tiene prioridad sobre el diálogo de progreso; el display dialog "gris" (es decir, desactiva) todos los botones del diálogo de progreso.

Así que, para tener en cuenta esto, en el código de ProgressBarTest.app, añadí un delay 5 directamente sobre el display dialog "The progress dialog should be gone at this point." línea. Quería ver si podía cerrar con éxito el diálogo de progreso, si el diálogo de progreso era el único diálogo activo de la aplicación.

He probado el siguiente código:

tell application "System Events" to tell process "ProgressBarTest.app"
    if exists window "ProgressBarTest.app" then
        click button 1 of window "ProgressBarTest.app"
    end if
end tell

En el código anterior, button 1 se refiere al Stop que se encuentra en el diálogo de progreso. (También puede utilizar button -4 o button 0 para referirse a este mismo botón).

La buena noticia es que este código cerró con éxito el diálogo de progreso.

La mala noticia, sin embargo, es que cuando el diálogo de progreso Stop en lugar de cerrarse sólo el diálogo de progreso, el todo el script se cancela. Esto es obviamente indeseable.

root del problema es que el diálogo de progreso no contiene ninguna "x" roja; el botón circular más a la izquierda de la barra superior de este diálogo está siempre en gris. En otras palabras, no hay manera de cerrar el diálogo de progreso manualmente, sin terminar también prematuramente el script.

Así que este problema es más difícil de resolver de lo que pensaba.

Parece que mi resultado deseado es imposible de conseguir.


OS X El Capitan, versión 10.11.6.


5voto

wch1zpink Puntos 11

Me funciona en la última versión de Sierra

SOLUCIÓN 1

set n to 5

set progress total steps to n
set progress description to "Script Progress"
set progress additional description to "Additional description"

repeat with i from 1 to n
    delay 0.1
    set progress completed steps to i
end repeat
return
quit

on quit
    activate
    display dialog "The progress dialog should be gone at this point."
    continue quit -- allows the script to quit
end quit

enter image description here

Esta es una forma de ejecutar algunos bucles de repetición antes de que el script se cierre

set n to 5

set progress total steps to n
set progress description to "Script Progress"
set progress additional description to "Additional description"

repeat with i from 1 to n
    delay 0.1
    set progress completed steps to i
end repeat
return
quit

on quit
    activate
    display dialog "The progress dialog should be gone at this point."
    repeat 5 times
        my get_my_IP()
        my screenCaptureToDesktop()
        delay 1
    end repeat
    continue quit -- allows the script to quit
end quit

on get_my_IP()
    activate
    tell current application to display dialog (do shell script "curl ifconfig.co") with icon 2 buttons "OK" default button 1 with title "Your Current IP Address Is.." giving up after 5 -- "curl ifconfig.io"    -- alternate
end get_my_IP

on screenCaptureToDesktop()
    do shell script "/usr/sbin/screencapture \"" & ¬
        POSIX path of (path to desktop as string) & ¬
        "Screen Shot " & (current date) & ".png\""
end screenCaptureToDesktop

ACTUALIZACIÓN

SOLUCIÓN 2

Trabajando en uno de mis propios proyectos, tuve uno de esos momentos de "¡EUREKA!". Aquí hay un enfoque completamente diferente a mi código en la SOLUCIÓN 1. El enfoque aquí fue para envolver la mayor parte de mi código en script objetos o manejadores, a continuación, llamar a los objetos según sea necesario. En esta solución, guardé este script como una aplicación abierta, con manejadores explícitos de ejecución e inactividad. Parte del código se ejecuta cuando la aplicación es lanzada, pero la mayoría de los comandos realmente ocurren dentro del manejador de inactividad.

Creo que esta solución es más prometedora que la SOLUCIÓN 1.

global allFiles, thisFile, theFileCount, ProgressBar, mainFolder, backupFolder, theDate

on run
    run ProgressBar
end run

on idle
    delay 0.2
    activate
    set theButton to button returned of (display dialog ¬
        "The progress dialog should be gone at this point." buttons {"QUIT", "CONTINUE"} ¬
        default button ¬
        "CONTINUE" with title ¬
        "BACKUP UTILITY" with icon 0 ¬
        giving up after 10)
    if theButton = "QUIT" then
        quit
    else if theButton = "" then
        quit
    else if theButton = "CONTINUE" then
        try
            run ProgressBar
        end try
    end if
    return 1
end idle

on quit
    --  Executed when the script quits
    continue quit -- allows the script to quit
end quit

script ProgressBar
    set mainFolder to choose folder with prompt ¬
        "PLEASE CHOOSE YOUR SOURCE FOLDER TO BACKUP"
    set backupFolder to choose folder with prompt ¬
        "PLEASE CHOOSE YOUR BACKUP DESTINATION FOLDER"
    set theDate to (current date) - (14 * days)

    tell application "Finder"
        set allFiles to entire contents of folder mainFolder as alias list
    end tell

    set theFileCount to count of allFiles

    set progress total steps to theFileCount
    set progress completed steps to 0
    set progress description to "Processing Files..."
    set progress additional description to "Preparing to process."

    repeat with theName from 1 to number of items in allFiles
        set this_item to item theName of allFiles
        tell application "Finder"
            duplicate this_item to backupFolder ¬
                with replacing
        end tell
        set progress additional description to ¬
            "Duplicating File " & theName & " of " & theFileCount & ¬
            " to folder " & backupFolder
        set progress completed steps to theName
    end repeat

    -- Reset the progress information
    set progress total steps to 0
    set progress completed steps to 0
    set progress description to ""
    set progress additional description to ""
end script

enter image description here

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