Je suis d'accord avec @stark, une interface graphique est la solution.
À titre purement illustratif, voici une non-GUI non recommandée manière qui montre comment le faire en utilisant un thread, un sous-processus et un canal nommé comme IPC.
Il existe deux scripts :
-
entry.py
:accepter les commandes d'un utilisateur, faire quelque chose avec la commande, la passer au tube nommé indiqué sur la ligne de commande :#!/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
:Lancez la console d'entrée, imprimez les mises à jour constantes dans un thread, acceptez les entrées du canal nommé et transmettez-les au thread de mises à jour :#!/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)
Pour l'essayer, exécutez :
$ python view.py
Plutôt que d'utiliser une console ou une fenêtre de terminal, réexaminez votre problème. Ce que vous essayez de faire est de créer une interface graphique. Il existe un certain nombre de boîtes à outils multiplateformes, notamment Wx et Tkinter, qui disposent de widgets pour faire exactement ce que vous voulez. Une zone de texte pour la sortie et un widget d'entrée pour lire la saisie au clavier. De plus, vous pouvez les emballer dans un joli cadre avec des titres, de l'aide, ouvrir/enregistrer/fermer, etc.