我试图做一个程序,将推出两种视图窗口(控制台)和命令行。 在视图窗口,它会显示不断更新,而在命令行窗口中会使用raw_input()
接受影响视图窗口的命令。 我正在考虑使用线程这一点,但我不知道如何在新的控制台窗口启动一个线程。 我会怎么做呢?
Answer 1:
除了使用控制台或终端窗口,重新审视你的问题。 你所要做的是创建一个GUI。 还有一些跨平台的工具包,包括W1和Tkinter的有小部件做的正是你想要的。 输出的文本框和读取键盘输入的条目小部件。 另外,你可以在一个不错的框架与职称,帮助,打开/保存/关闭等包装他们
Answer 2:
我同意@stark一个GUI是这样的。
纯粹是为了说明这里说明了如何使用一个线程,一个子进程和命名管道作为IPC做一个不推荐非GUI方式。
有两个脚本:
entry.py
:从用户接受命令,做一些事情的命令,它通过在命令行给出的命名管道:#!/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
:启动进入控制台,在一个线程打印的不断更新,从命名管道接受输入,并将其传递给更新线程:#!/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)
要尝试它,运行:
$ python view.py
文章来源: Opening a Python thread in a new console window