【问题标题】:How to take input from stdin, display something using curses and output to stdout?如何从标准输入获取输入,使用诅咒显示某些内容并输出到标准输出?
【发布时间】:2016-09-25 15:48:53
【问题描述】:

我正在尝试制作一个 python 脚本,该脚本从标准输入获取输入,使用 curses 在终端中显示 GUI,然后当用户完成交互时将结果输出到标准输出。这种行为的一个很好的例子是selecta,但它是用 ruby​​ 编写的。

我无法让 curses 显示任何内容。这是迄今为止我尝试过的最小示例(它只显示一个字符并等待一个字符):

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) 时没有显示任何内容,但在按下任意键后会显示其编号:

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

【问题讨论】:

    标签: python curses python-curses


    【解决方案1】:

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

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

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

    进一步阅读:

    【讨论】:

    • 哦,是的,这是我在简化示例时犯的一个错误,但我担心这无关紧要或者至少还有一个更大的问题:curses output (s.addch(ord('a'))) is not displayed这应该在打印s.getch() 的结果之前发生。尽管如此,我还是修复了代码,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多