GNU/Linux >> Linux Esercitazione >  >> Linux

Apertura di un thread Python in una nuova finestra della console

Sono d'accordo con @stark una GUI è la soluzione.

A puro scopo illustrativo ecco una non-GUI non consigliata modo che mostra come farlo usando un thread, un sottoprocesso e una named pipe come IPC.

Ci sono due script:

  • entry.py :accetta i comandi da un utente, fa qualcosa con il comando, passalo alla named pipe fornita dalla riga di comando:

    #!/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 :avvia la console di ingresso, stampa gli aggiornamenti costanti in un thread, accetta l'input dalla named pipe e passalo al thread degli aggiornamenti:

    #!/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)
    

Per provarlo, esegui:

$ python view.py

Piuttosto che utilizzare una console o una finestra di terminale, riesamina il tuo problema. Quello che stai cercando di fare è creare una GUI. Esistono numerosi toolkit multipiattaforma tra cui Wx e Tkinter che dispongono di widget per fare esattamente quello che vuoi. Una casella di testo per l'output e un widget di immissione per la lettura dell'input da tastiera. Inoltre puoi avvolgerli in una bella cornice con titoli, aiuto, apri/salva/chiudi, ecc.


Linux
  1. Schermata di Gnu:cambio del nome della nuova finestra?

  2. Come modificare l'opacità della finestra in modo dinamico e rapido in Python?

  3. Errore del server MySQL – "Impossibile creare un nuovo thread (errno 11)"

  4. Come ottenere la larghezza della finestra della console Linux in Python

  5. errno è thread-safe?

Python if..else Istruzione

Titolo dell'applicazione Qt

gnome-terminal:come preservare i collegamenti simbolici della directory di lavoro all'apertura di una nuova scheda?

Terminale di compensazione

Come modificare la directory predefinita della nuova finestra dall'interno di tmux

Genera una nuova finestra di terminale con la stessa directory della finestra precedente