1

我正在尝试制作一个从标准输入获取输入的python脚本,使用curses在终端中显示GUI,然后当用户完成交互时将结果输出到标准输出。这种行为的一个很好的例子是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)不显示任何内容但按任意键后显示其编号:

诅咒在终端中不显示任何内容

这样的事情甚至可以使用诅咒,如果是这样怎么做?

4

1 回答 1

2

它不起作用,因为该print语句正在写入与curses.wrapper. 您可以将其推迟print到 restore 之后sys.stdout,也可以使用以下file=属性:

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

对于另一个(排序)问题,听起来好像您需要修改代码以在(使curses显示它)之后进行刷新,并且根据curses的版本,刷新标准输出会有所帮助.getch

进一步阅读:

于 2016-10-16T10:24:28.413 回答