如何从stdin获取输入,使用curses显示内容并输出到stdout?

时间:2016-09-25 15:48:53

标签: python curses python-curses

我试图创建一个从stdin获取输入的python脚本,使用curses在终端中显示GUI,然后在用户完成交互时将结果输出到stdout。这种行为的好例子是selecta,但它是用ruby编写的。

我无法让诅咒显示任何内容。这是最小的(它只显示一个字符并等待一个字符)我到目前为止尝试的例子:

import os, sys
import curses

c = None

old_out = sys.__stdout__
old_in = sys.__stdin__
old_err = sys.__stderr__
sys.__stdout__ = sys.stdout = open('/dev/tty', 'w')
sys.__stdin__ = sys.stdin = open('/dev/tty')
sys.__stderr__ = sys.stderr = open('/dev/tty')


def show_a(s):
    global c
    s.addch(ord('a'))
    c = s.getch()

curses.wrapper(show_a)

sys.stdin.flush()
sys.stdout.flush()
sys.stderr.flush()
sys.stdin.close()
sys.stdout.close()
sys.stderr.close()
sys.__stdout__ = sys.stdout = old_out
sys.__stdin__ = sys.stdin = old_in
sys.__stderr__ = sys.stderr = old_err

print(c)

当我尝试使用echo $(python3 show_a.py)时,不会显示任何内容,但在按任意键后会显示其编号:

curses displays nothing in terminal

使用诅咒甚至可以做到这一点,如果是这样的话怎么做?

1 个答案:

答案 0 :(得分:1)

它不起作用,因为print语句写入与curses.wrapper相同的标准输出。您可以将print推迟到恢复sys.stdout之后,或者您可以使用file=属性,如下所示:

printf(s.getch(), file=old_out)

对于其他(排序)问题,听起来好像你需要修改代码以在getch之后执行refresh(使curses显示它),并且取决于什么版本的curses,标准输出的 flush 会有所帮助。

进一步阅读: