GNU/Linux >> Belajar Linux >  >> Linux

Membuka utas Python di jendela konsol baru

Saya setuju dengan @stark, GUI adalah caranya.

Sebagai ilustrasi, inilah non-GUI yang tidak direkomendasikan cara yang menunjukkan cara melakukannya menggunakan utas, subproses, dan pipa bernama sebagai IPC.

Ada dua skrip:

  • entry.py :menerima perintah dari pengguna, melakukan sesuatu dengan perintah tersebut, meneruskannya ke pipa bernama yang diberikan pada baris perintah:

    #!/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 :Luncurkan konsol entri, cetak pembaruan konstan dalam utas, terima input dari pipa bernama dan teruskan ke utas pembaruan:

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

Untuk mencobanya, jalankan:

$ python view.py

Daripada menggunakan jendela konsol atau terminal, periksa kembali masalah Anda. Apa yang Anda coba lakukan adalah membuat GUI. Ada sejumlah toolkit lintas platform termasuk Wx dan Tkinter yang memiliki widget untuk melakukan apa yang Anda inginkan. Kotak teks untuk output dan widget entri untuk membaca input keyboard. Selain itu, Anda dapat membungkusnya dalam bingkai yang bagus dengan judul, bantuan, buka/simpan/tutup, dll.


Linux
  1. Layar Gnu:Perubahan Nama Jendela Baru?

  2. Pintasan/perintah Keyboard Untuk Membuka Jendela Nautilus Baru Dan Menaikkannya?

  3. Bagaimana Mengubah Opacity Window Secara Dinamis Dengan Python Dan Cepat?

  1. C ++ keamanan utas operator baru di linux dan gcc 4

  2. Apakah errno thread-safe?

  3. Dapatkan judul jendela saat ini dengan Python dan Xorg

  1. Thread ID vs Thread Handle

  2. Judul aplikasi Qt

  3. Cara mengubah direktori jendela baru default dari dalam tmux