GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Öffnen eines Python-Threads in einem neuen Konsolenfenster

Ich stimme @stark zu, eine GUI ist der Weg.

Rein zur Veranschaulichung ist hier eine nicht empfohlene Nicht-GUI Weise, die zeigt, wie man es mit einem Thread, einem Unterprozess und einer Named Pipe als IPC macht.

Es gibt zwei Skripte:

  • entry.py :Befehle von einem Benutzer akzeptieren, etwas mit dem Befehl tun, ihn an die benannte Pipe übergeben, die in der Befehlszeile angegeben ist:

    #!/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 :Starte die Eingabekonsole, drucke ständige Updates in einem Thread, akzeptiere Eingaben von der Named Pipe und übergebe sie an den Updates-Thread:

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

Führen Sie zum Ausprobieren Folgendes aus:

$ python view.py

Anstatt eine Konsole oder ein Terminalfenster zu verwenden, untersuchen Sie Ihr Problem erneut. Was Sie versuchen, ist eine GUI zu erstellen. Es gibt eine Reihe von plattformübergreifenden Toolkits, darunter Wx und Tkinter, die Widgets enthalten, um genau das zu tun, was Sie wollen. Ein Textfeld für die Ausgabe und ein Eingabe-Widget zum Lesen von Tastatureingaben. Außerdem können Sie sie in einen schönen Rahmen mit Titeln, Hilfe, Öffnen/Speichern/Schließen usw. packen.


Linux
  1. Wie erstelle ich ein neues Fenster im aktuellen Verzeichnis in Tmux?

  2. Gnu-Bildschirm:Neuer Fenstername geändert?

  3. Tastaturkürzel / Befehl zum Öffnen eines neuen Nautilus-Fensters und zum Anheben?

  4. Wie ändere ich die Fensterdeckkraft dynamisch und schnell in Python?

  5. C++ neue Operator-Thread-Sicherheit in Linux und gcc 4

Python if..else-Anweisung

ID eines Python-Threads, wie von top gemeldet

Gnome-Terminal:Wie werden Symlinks des Arbeitsverzeichnisses beibehalten, wenn ein neuer Tab geöffnet wird?

Clearing-Terminal

Neues Terminalfenster (doppelte Sitzung) von der Putty-Befehlszeile?

Eröffnen Sie ein neues Terminalfenster mit demselben Verzeichnis wie das vorherige Fenster