1 votos

¿Cómo obtener la entrada de la interfaz gráfica de usuario de BASH scripts?

De un BASH script quiero obtener la entrada del usuario y cambiar la configuración del sistema, en un bucle. Primero intenté CocoaDialog pero eso tiene un defecto fatal: los diálogos siempre están encima de otras ventanas.

Idealmente, podría lanzar un diálogo con los botones "establecer el modo de suspensión" y "establecer el modo de vigilia" (para activar el ajuste "Evitar que la computadora se suspenda automáticamente cuando la pantalla está apagada") y el diálogo/ventana se mantendría cuando se pulsen los botones. En el caso de CocoaDialog, tenía que poner un nuevo diálogo cada vez que se pulsaba un botón. Habría estado bien, pero aparte del problema mencionado anteriormente, al poner un nuevo diálogo se posiciona en el centro de la pantalla y no donde estaba el antiguo (y cocoaDialog no tiene argumentos de posicionamiento para los diálogos).

¿Alguien sabe de una solución? Sospecho que AppleScript funcionaría, pero es muy complejo y no he podido encontrar ejemplos adecuados que pudiera copiar/modificar.

Gracias.

1voto

RSMoser Puntos 537

He encontrado dos soluciones. La mejor es la segunda.

Solución #1: usar Tcl/Tk:

#! /usr/bin/env wish8.5
# Adapted from brilliant example here:
#   http://stackoverflow.com/questions/166231/tcl-tk-examples

package require Tk

proc main {} {
if {[lsearch -exact [font names] TkDefaultFont] == -1} {
    # older versions of Tk don't define this font, so pick something
    # suitable
    font create TkDefaultFont -family Helvetica -size 12
}
# in 8.5 we can use {*} but this will work in earlier versions
eval font create TkBoldFont [font actual TkDefaultFont] -weight bold

buildUI
}

proc buildUI {} {
frame .toolbar
scrollbar .vsb -command [list .t yview]
text .t \
    -width 80 -height 10 \
    -yscrollcommand [list .vsb set] \
    -highlightthickness 0
.t tag configure command -font TkBoldFont
.t tag configure error   -font TkDefaultFont -foreground firebrick
.t tag configure output  -font TkDefaultFont -foreground black

grid .toolbar -sticky nsew
grid .t .vsb  -sticky nsew
grid rowconfigure . 1 -weight 1
grid columnconfigure . 0 -weight 1

set i 0
foreach {label command} {
    awake     {prevent_computer_sleep}
    sleep     {allow_computer_sleep}
    status    {pmset -g | grep sleep}
} {
    button .b$i -text $label -command [list runCommand $command]
    pack .b$i -in .toolbar -side left
    incr i
}
}

proc output {type text} {
.t configure -state normal
.t insert end $text $type "\n"
.t see end
.t configure -state disabled
}

proc runCommand {cmd} {
output command $cmd
set f [open "| $cmd" r]
fconfigure $f -blocking false
fileevent $f readable  [list handleFileEvent $f]
}

proc closePipe {f} {
# turn blocking on so we can catch any errors
fconfigure $f -blocking true
if {[catch {close $f} err]} {
    output error $err
}
}

proc handleFileEvent {f} {
set status [catch { gets $f line } result]
if { $status != 0 } {
    # unexpected error
    output error $result
    closePipe $f

} elseif { $result >= 0 } {
    # we got some output
    output normal $line

} elseif { [eof $f] } {
    # End of file
    closePipe $f

} elseif { [fblocked $f] } {
    # Read blocked, so do nothing
}
}

main

donde prevent_computer_sleep sólo hace sudo pmset sleep 0 y allow_computer_sleep hace sudo pmset sleep 1 .

Solución #2: modificar KeepingYouAwake para usar el sueño del sistema y no el sueño de la pantalla: mi tenedor de Mantenerte despierto .

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