GNU/Linux >> Tutoriels Linux >  >> Linux

Ouverture d'un thread Python dans une nouvelle fenêtre de console

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.


Linux
  1. Écran Gnu :changement de nom de la nouvelle fenêtre ?

  2. Erreur du serveur MySQL - "Impossible de créer un nouveau fil (errno 11)"

  3. C++ nouvel opérateur de sécurité des threads dans Linux et gcc 4

  4. Comment changer le nouveau répertoire de fenêtre par défaut à partir du tmux

  5. Générer une nouvelle fenêtre de terminal avec le même répertoire que la fenêtre précédente

Instruction Python if..else

Comment changer dynamiquement l'opacité de la fenêtre en Python et rapidement ?

Comment obtenir la largeur de la fenêtre de la console Linux en Python

ID de thread vs poignée de thread

Titre de l'application Qt

Borne de dédouanement