Il bug:
Quando la finestra di dialogo di avanzamento di AppleScript è seguita da una finestra di dialogo, la finestra di dialogo di avanzamento rimane ancora aperta, anche se tutti i passaggi di avanzamento sono stati completati e la barra di avanzamento è piena. Rimarrà fino a quando lo script non sarà stato annullato, fino a quando lo script non sarà stato completato o fino a quando non saranno presenti ulteriori finestre di dialogo nello script.
Questo bug non può essere visto durante l'esecuzione del codice da Script Editor.app, perché, in Script Editor, non verrà visualizzata una finestra di dialogo di avanzamento. Al contrario, un indicatore di avanzamento a forma di torta è integrato nella parte inferiore della finestra dello script.
Come riprodurre il bug:
Salva il seguente codice AppleScript come file .app:
(Il file deve essere un file .app, poiché i file .scpt non possono visualizzare le finestre di dialogo di avanzamento.)
imposta n su 5
imposta avanzamento totale passi a n
imposta la descrizione dell'avanzamento su "Avanzamento script"
imposta la descrizione aggiuntiva dell'avanzamento su "Descrizione aggiuntiva"
ripetere con i da 1 a n
ritardo 0.1
imposta l'avanzamento dei passaggi completati su i
fine ripetizione
display dialog "La finestra di dialogo di avanzamento dovrebbe essere scomparsa a questo punto."
All'avvio dell'applicazione, vedrai quanto segue:
La domanda:
Esiste una soluzione alternativa per forzare la chiusura della finestra di dialogo di avanzamento una volta completata, in modo che ulteriori finestre di dialogo possano essere posizionate dopo la finestra di dialogo di avanzamento, senza che la finestra di dialogo di avanzamento sia ancora visibile?
Cosa ho provato:
Ho provato ad affrontare il problema interpretando la finestra di dialogo di avanzamento semplicemente come una "finestra" dell'app.
Se esegui il codice seguente in un file AppleScript separato, mentre entrambe le finestre di dialogo di ProgressBarTest.app sono sullo schermo (come nello screenshot sopra):
indica all'applicazione "Eventi di sistema"
imposta allWindows al nome della finestra dei processi il cui visibile è vero
fine raccontare
return allWindows
imparerai che ProgressBarTest.app ha 2 "finestre" aperte. I titoli di queste finestre sono:
{"", "ProgressBarTest.app"}
La prima finestra in questo elenco fa riferimento alla finestra di dialogo display dialog
. La seconda finestra in questo elenco, intitolata ProgressBarTest.app
, è la finestra di dialogo di avanzamento.
Ho quindi tentato di chiudere questa "finestra" di dialogo di avanzamento utilizzando AppleScript (come si può fare per qualsiasi finestra dell'applicazione standard). Tuttavia, il codice seguente:
indica all'applicazione "Eventi di sistema" di indicare al processo "ProgressBarTest.app"
se esiste la finestra "ProgressBarTest.app" allora
chiudere la finestra "ProgressBarTest.app"
finisci se
fine raccontare
darà all'utente un errore. Il testo di questa finestra di dialogo di errore è:
Script Error
Gli eventi di sistema hanno ricevuto un errore: la finestra "ProgressBarTest.app" del processo "ProgressBarTest.app" non comprende il messaggio "chiudi".
Mi sono reso conto subito che, se il tuo schermo è lo stesso punto di vista di quello dello screenshot qui sopra, non puoi nemmeno chiudere manualmente la finestra di dialogo di avanzamento. Questo perché la finestra di dialogo display dialog
ha la precedenza sulla finestra di avanzamento; la finestra di dialogo display dialog
"disattiva" (ovvero, disabilita) tutti i pulsanti nella finestra di dialogo di avanzamento.
Quindi, per tenere conto di questo, nel codice ProgressBarTest.app, ho aggiunto un / code> riga. Volevo vedere se riuscivo a chiudere correttamente la finestra di dialogo di avanzamento, se la finestra di dialogo di avanzamento era l'unica finestra di dialogo attiva dell'applicazione. Ho provato il seguente codice: Nel codice precedente, La buona notizia è che questo codice è stato chiuso con successo dalla finestra di dialogo di avanzamento! La cattiva notizia, tuttavia, è che quando viene premuto il pulsante Stop della finestra di dialogo di avanzamento, invece di chiudere solo la finestra di dialogo di avanzamento, l ' intero script viene cancellato. Questo è ovviamente indesiderabile. La radice del problema è che la finestra di dialogo di avanzamento non contiene "x" rosse; il pulsante circolare più a sinistra nella barra superiore di questa finestra di dialogo è sempre disattivato. In altre parole, non è possibile chiudere manualmente la finestra di dialogo di avanzamento, senza anche terminare prematuramente lo script. Quindi, questo problema è più difficile da risolvere di quanto pensassi. Sembra che il risultato desiderato sia impossibile da ottenere. OS X El Capitan, versione 10.11.6. ritardo 5
direttamente sopra la finestra di dialogo di visualizzazione "La finestra di dialogo di avanzamento dovrebbe essere scomparsa a questo punto."
indica all'applicazione "Eventi di sistema" di indicare al processo "ProgressBarTest.app"
se esiste la finestra "ProgressBarTest.app" allora
fare clic sul pulsante 1 della finestra "ProgressBarTest.app"
finisci se
fine raccontare
button 1
si riferisce al pulsante Stop che si trova nella finestra di dialogo di avanzamento. (In alternativa, puoi utilizzare button -4
o button 0
per fare riferimento a questo stesso pulsante.)