Linux Fu: Python GUI para programas de línea de comandos (casi) inmediatamente

No a todos los desarrolladores les gusta crear un código GUI. La mayoría de los piratas informáticos no se molestan en utilizar una interfaz de línea de comandos, pero muy pocos usuarios normales las aprecian. Sin embargo, si está escribiendo programas de línea de comandos en Python, Gooey puede ayudarlo. Con algunas funciones de Python y un lenguaje Python común, puede convertir un programa de línea de comandos en una GUI con muy poco esfuerzo.

La idea es bastante sencilla. Casi todos los programas de Python de línea de comando usan argparse para simplificar las opciones de selección y los argumentos desde la línea de comando y también brindar algo de ayuda. El decorador de Gooey recoge todas sus opciones y argumentos y crea una GUI para ello. Puede hacerlo más fácil si desea cambiar cosas específicas, pero si está satisfecho con los valores predeterminados, no mucho más.

Al principio, este artículo puede parecer Python Fu y no Linux Fu, porque, primero, nos centraremos en Python. Pero espere y verá cómo esto puede hacer muchas cosas en muchos sistemas operativos, incluido Linux.

Las manos en

Teníamos que probarlo. Aquí está el código del argparse página de manual, extendida para vivir dentro de la función principal:

import argparse

def main():

   parser = argparse.ArgumentParser(description='Process some integers.')
   parser.add_argument('integers', metavar="N", type=int, nargs="+",
         help='an integer for the accumulator')
   parser.add_argument('--sum', dest="accumulate", action='store_const',
        const=sum, default=max,
   help='sum the integers (default: find the max)')

   args = parser.parse_args()
   print(args.accumulate(args.integers))

main()

Puede ejecutar esto en la línea de comando (lo llamamos iprocess.py):

python iprocess.py 4 33 2
python iprocess.py --sum 10 20 30

En el primer caso, el programa seleccionará e imprimirá el número más grande. En el segundo caso, sumará todos los argumentos.

La creación de una GUI tomó exactamente dos pasos (además de instalar Gooey): Primero, importa Gooey en la parte superior del archivo:

from gooey import Gooey

Luego agregue el adorno @Gooey en la línea antes de la definición principal (y, sí, realmente debería estar en la línea anterior, no en la misma línea):

@Gooey
def main():

El resultado se ve así:

Es posible que desee mejorar los resultados y también puede agregar la validación con bastante facilidad, por lo que algunos campos son necesarios o deben contener tipos particulares de datos.

Seguro que funciona en Linux, pero ...

Python, por supuesto, funciona en muchas plataformas diferentes. Entonces, ¿por qué esta parte de Linux Fu? Porque puede usarlo fácilmente para iniciar cualquier programa de línea de comandos. Es cierto que esto también debería funcionar en otros sistemas operativos, pero es especialmente útil en Linux, donde hay tantos programas de línea de comandos.

Lo vimos por primera vez en el blog de Chris Kiehl, donde hace una interfaz gráfica de usuario (o Gooey, supongo) para ffmpeg, que tiene muchas opciones de línea de comandos. La idea es escribir un argumento simple arreglado para el programa y luego decirle a una GUI lo que es factible ejecutar después de componer la línea de comandos.

Aquí está el código de Chris:

from gooey import Gooey, GooeyParser

@Gooey(target="ffmpeg", program_name="Frame Extraction v1.0", suppress_gooey_flag=True)
def main():
   parser = GooeyParser(description="Extracting frames from a movie using FFMPEG")
   ffmpeg = parser.add_argument_group('Frame Extraction Util')
      ffmpeg.add_argument('-i',
      metavar="Input Movie",
      help='The movie for which you want to extract frames',
      widget="FileChooser")
   ffmpeg.add_argument('output',
      metavar="Output Image",
      help='Where to save the extracted frame',
      widget="FileSaver")
   ffmpeg.add_argument('-ss',
      metavar="Timestamp",
      help='Timestamp of snapshot (in seconds)')
   ffmpeg.add_argument('-frames:v',
      metavar="Timestamp",
      default=1,
      gooey_options={'visible': False})

parser.parse_args()

if __name__ == '__main__':
   main()

Incluso tienes la opción de crear un archivo JSON que Gooey pueda leer si no quieres escribir Python. La utilidad de esto es fácilmente visible, pero me gustaría escuchar algunos ejemplos concretos de dónde cree que será útil. Si ya está usando Gooey, o planea probarlo después de leer este artículo, háganoslo saber en los comentarios a continuación.

Por supuesto, no todas las interfaces de Python son iguales. No todos los gráficos de Python lo son.

  • Ostraco dice:

    Una especie de visión DESQview del mundo CL.

  • Forian Festi dice:

    Hice algo muy similar con mi generador de cajas Boxes.py (https://la-tecnologia.io/project/10649-boxespy). En lugar de una GUI, genera una interfaz de Internet del objeto argparse.argparser. Está limitado a un pequeño conjunto de especies, pero las cosas comunes funcionan. Consulte https://festi.info/boxes.py/UniversalBox para ver un ejemplo más complejo. La implementación, sin embargo, es un poco loca.

  • Bram dice:

    Escribí una pequeña utilidad de Python para usar en un entorno de oficina. Gooey intentó presentarlo como un simple programa de escritorio. Me gusta el concepto, pero terminarás reemplazando argparse con gooey para acceder a las partes realmente útiles de gooey. Por ejemplo, los botones de exploración para seleccionar archivos. No poder usar más argparse es una gran desventaja. Además, cuando usa gooey en lugar de argparse, la interfaz gráfica de usuario se inicia de forma predeterminada y "suelta" el cli (hay una bandera para decirle a gooey que use el cli, pero no puedo y no quiero recordar).
    Para mi caso de uso, sería muy bueno si todas las configuraciones de pegamento se hicieran con decoradores y la interfaz gráfica de usuario opcional con una bandera - - interfaz gráfica de usuario. La herramienta comenzaría desde un menú de inicio o un ícono de escritorio de todos modos. Debe haber formas de detectar el código llamado por la interfaz gráfica de usuario o cli.

    • KenN dice:

      ¿Declaraciones de importación condicionales basadas en banderas personalizadas?
      ¿Archivos de inicio / lanzamiento con diferentes nombres para las versiones de GUI y CLI?

  • Andrea Campanella dice:

    ¿Funcionaría con un frame buffer?

  • Sierra dice:

    Python siempre se ve como "casi) INMEDIATAMENTE" en ejemplos cuidadosamente seleccionados de un ratón de biblioteca. Pero cuando intentas implementar algo útil en el mundo real, se vuelve feo después de las primeras 200 líneas de código.

    Sin embargo, los funboys de Python no son molestos, por lo que puede ver un "programa de Python" que deja un rastro cuando se presiona Ctrl + C.

    • Bernard Kerckenaere dice:

      Claro, culpemos al lenguaje: D

Eva Jiménez
Eva Jiménez

Deja una respuesta

Tu dirección de correo electrónico no será publicada.