Python将光标向前移动两个位置

时间:2018-01-18 02:11:27

标签: python python-3.x terminal cursor

我编写了下面的程序,该程序旨在充当我即将为大学项目构建的聊天的终端UI。在目前的状态下,目标是始终将最后一行作为写入消息的区域,当按下Enter时,消息写在上面,最后一行再次变为空白。

如果这就是我想要的,那就行得很好。但是,我也希望在最后一行的开头总是有一些“提示符号”,即:>。为了实现这一点,当按下enter时,将删除整个当前行,打印裸信息,插入换行符,最后我希望在新行中打印:>并重复。

但是,确实打印了提示字符串,但是在第一次输入后,光标从行的开头开始,这意味着任何后续输入都将覆盖提示字符。由于某种原因第一次发生这种情况,在发生任何其他事情之前打印第一个提示。

所以最后,我想要一种方法让光标在打印换行符后在两个提示字符后实际启动。这就是我想要的关于终端功能的所有内容,因此我想找到一种简单的方法来解决这个问题,而不是干涉ncurses库等。谢谢大家的时间。在我想要发生的任何事情发生的代码中的兴趣点是在最后一个while循环中。

代码应该使用Python3运行。

import sys
from string import printable
import termios
import tty

class _Getch:
    """Gets a single character from standard input.  Does not echo to the
    screen."""
    def __init__(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            self.impl = _GetchUnix()

    def __call__(self): return self.impl()
class _GetchUnix:
    def __init__(self):
        import tty, sys

    def __call__(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            # ch = sys.stdin.read(1)
            ch = sys.stdin.read(1)[0]
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch
class _GetchWindows:
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()

# enter: ord 13
#backspace: ord 127

current_input = ""
prompt_msg = ":> "

print(10*"\n"+prompt_msg,end="")

getch = _Getch()

def clear_input():
    linelen = (len(current_input)+len(prompt_msg))
    sys.stdout.write("\b"*linelen+" "*linelen+"\b"*linelen)
    sys.stdout.flush()


while(True):

    ch=getch()
    if ord(ch)==3:# ctrl+c
        exit()
    # >>>>>>>.POINT OF INTEREST<<<<<<<<<<<
    if ord(ch)==13:# enter
        clear_input()
        print(current_input)
        current_input = ""

        # print(prompt_msg,end="")
        sys.stdout.write(prompt_msg)
        sys.stdout.flush()

    if ord(ch)==127 and len(current_input)>0:# backspace
        sys.stdout.write("\b"+" "+"\b")
        sys.stdout.flush()
        current_input=current_input[:-1]
    if ch in printable or ord(ch)>127: # printable
        current_input+=ch
        sys.stdout.write(ch)
        sys.stdout.flush()

1 个答案:

答案 0 :(得分:0)

而不是试图让指针前进两个位置 - 我没有找到答案的答案 - 我只是从每个地方的current_input字符串中删除了回车符(“\ r”)应该这样做 - 在字符串中存在流氓回车字符,这似乎导致了问题。