GNU/Linux >> Tutoriales Linux >  >> Linux

Abrir un hilo de Python en una nueva ventana de consola

Estoy de acuerdo con @stark, una GUI es el camino.

Puramente a modo de ilustración, aquí hay una no recomendada sin GUI manera que muestra cómo hacerlo usando un hilo, un subproceso y una canalización con nombre como IPC.

Hay dos guiones:

  • entry.py :acepte comandos de un usuario, haga algo con el comando, páselo a la tubería con nombre que se proporciona en la línea de comandos:

    #!/usr/bin/env python
    import sys
    
    print 'entry console'
    with open(sys.argv[1], 'w') as file:
        for command in iter(lambda: raw_input('>>> '), ''):
            print ''.join(reversed(command)) # do something with it
            print >>file, command # pass the command to view window
            file.flush()
    
  • view.py :Inicie la consola de entrada, imprima actualizaciones constantes en un subproceso, acepte la entrada de la tubería nombrada y pásela al subproceso de actualizaciones:

    #!/usr/bin/env python
    import os
    import subprocess
    import sys
    import tempfile
    from Queue import Queue, Empty
    from threading import Thread
    
    def launch_entry_console(named_pipe):
        if os.name == 'nt': # or use sys.platform for more specific names
            console = ['cmd.exe', '/c'] # or something
        else:
            console = ['xterm', '-e'] # specify your favorite terminal
                                      # emulator here
    
        cmd = ['python', 'entry.py', named_pipe]
        return subprocess.Popen(console + cmd)
    
    def print_updates(queue):
        value = queue.get() # wait until value is available
    
        msg = ""
        while True:
            for c in "/-\|":
                minwidth = len(msg) # make sure previous output is overwritten
                msg = "\r%s %s" % (c, value)
                sys.stdout.write(msg.ljust(minwidth))
                sys.stdout.flush()
    
                try:
                    value = queue.get(timeout=.1) # update value
                    print
                except Empty:
                    pass
    
    print 'view console'
    # launch updates thread
    q = Queue(maxsize=1) # use queue to communicate with the thread
    t = Thread(target=print_updates, args=(q,))
    t.daemon = True # die with the program
    t.start()
    
    # create named pipe to communicate with the entry console
    dirname = tempfile.mkdtemp()
    named_pipe = os.path.join(dirname, 'named_pipe')
    os.mkfifo(named_pipe) #note: there should be an analog on Windows
    try:
        p = launch_entry_console(named_pipe)
        # accept input from the entry console
        with open(named_pipe) as file:
            for line in iter(file.readline, ''):
                # pass it to 'print_updates' thread
                q.put(line.strip()) # block until the value is retrieved
        p.wait()
    finally:
        os.unlink(named_pipe)
        os.rmdir(dirname)
    

Para probarlo, ejecuta:

$ python view.py

En lugar de usar una ventana de consola o terminal, vuelva a examinar su problema. Lo que está tratando de hacer es crear una GUI. Hay una serie de kits de herramientas multiplataforma que incluyen Wx y Tkinter que tienen widgets para hacer exactamente lo que desea. Un cuadro de texto para la salida y un widget de entrada para leer la entrada del teclado. Además, puede envolverlos en un bonito marco con títulos, ayuda, abrir/guardar/cerrar, etc.


Linux
  1. Pantalla Gnu:¿Cambio de nombre de nueva ventana?

  2. ¿Cómo cambiar la opacidad de la ventana dinámicamente en Python y rápidamente?

  3. Error del servidor MySQL:"No se puede crear un nuevo subproceso (errno 11)"

  4. C ++ nuevo operador de seguridad de subprocesos en linux y gcc 4

  5. Id. de subproceso frente a identificador de subproceso

Declaración de Python if..else

Título de la aplicación Qt

Terminal de compensación

¿Nueva ventana de terminal (sesión duplicada) desde la línea de comandos de Putty?

Cómo cambiar el directorio de nueva ventana predeterminado desde dentro de tmux

Genere una nueva ventana de terminal con el mismo directorio que la ventana anterior