我编写了下面的程序,该程序旨在充当我即将为大学项目构建的聊天的终端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()
答案 0 :(得分:0)
而不是试图让指针前进两个位置 - 我没有找到答案的答案 - 我只是从每个地方的current_input
字符串中删除了回车符(“\ r”)应该这样做 - 在字符串中存在流氓回车字符,这似乎导致了问题。