当有输出时,将仍然缓冲的标准输入行向下移动一位
Move still-buffered stdin line down by one when there is output
我在python写了一个简单的聊天程序。
你只有一个简单的 input() 提示符(使用 readline),它应该总是在底部。
partner: hey
you > (stdin)
现在,我在不使用 curses 的情况下进行尝试,并且通过定义这两个常量取得了成功
CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2M'
每当收到来自 'partner' 的消息时,我都会这样使用它:
print(ERASE_LINE + CURSOR_UP_ONE)
print('partner > ' + msg)
print('you > ')
这很好用,但是,有一个问题:当我开始输入时,就在收到来自 'partner' 的消息时,它会删除包括我输入的内容在内的行(然后我就无法再输入了) access) 和擦除的字符显然仍然是 input() returns.
的一部分
那么,有没有一种方法可以在没有 curses 的情况下向下移动输入提示,或者有一种方法可以缓冲输入的字符以便能够访问、显示和操作它们?
如果您将终端置于原始模式(使用模块 termios
),并在键入时处理每个击键,那么您将知道是否有打印合作伙伴消息之前的任何缓冲输入。
(另外,如何从合作伙伴(套接字?)接收消息,以及如何多路复用来自 TTY 和合作伙伴的输入?)
好的,我解决了我的问题。
我发现了模块 rl
。我是这样使用的:
import rl.readline as readline
# code
print(ERASE_LINE + CURSOR_UP_ONE)
print('partner > ' + msg)
readline.redisplay(True)
这只是重新显示提示,包括我输入的内容(正是我想要的)。
我在python写了一个简单的聊天程序。 你只有一个简单的 input() 提示符(使用 readline),它应该总是在底部。
partner: hey
you > (stdin)
现在,我在不使用 curses 的情况下进行尝试,并且通过定义这两个常量取得了成功
CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2M'
每当收到来自 'partner' 的消息时,我都会这样使用它:
print(ERASE_LINE + CURSOR_UP_ONE)
print('partner > ' + msg)
print('you > ')
这很好用,但是,有一个问题:当我开始输入时,就在收到来自 'partner' 的消息时,它会删除包括我输入的内容在内的行(然后我就无法再输入了) access) 和擦除的字符显然仍然是 input() returns.
的一部分那么,有没有一种方法可以在没有 curses 的情况下向下移动输入提示,或者有一种方法可以缓冲输入的字符以便能够访问、显示和操作它们?
如果您将终端置于原始模式(使用模块 termios
),并在键入时处理每个击键,那么您将知道是否有打印合作伙伴消息之前的任何缓冲输入。
(另外,如何从合作伙伴(套接字?)接收消息,以及如何多路复用来自 TTY 和合作伙伴的输入?)
好的,我解决了我的问题。
我发现了模块 rl
。我是这样使用的:
import rl.readline as readline
# code
print(ERASE_LINE + CURSOR_UP_ONE)
print('partner > ' + msg)
readline.redisplay(True)
这只是重新显示提示,包括我输入的内容(正是我想要的)。