使用从终端读取一个字符
- 返回字节(bytes)
- 通过
bytes.decode()
获取字符串(str)
- 没有回显(输入不可见)
- 在
_GetchWindows.__call__
中使用.getche
替代msvcrt.getch
msvcrt
没有全局导入
可以这样做
while input != '\r':
input += getch().decode()
并且
while msvcrt.kbhit():
remember_input += getch().decode()
print(erase)
由于复杂性(使用线程编写(我对此很陌生),输入/输出控制(因为这个原因,我的vsc终端每次都讨厌我),以及可能更多的原因我太累了无法想到),我自己没有完成过这个项目,但我相信你不会放弃。
编辑:哦,是的
我忘了提醒你,你也可能想要编写自己的print
和input
,
在这种情况下,有用的东西将是input(prompt, remember_string)
提示将无法通过退格键擦除,而remember_string会
大更新
我使用模块代替msvcrt(如最初建议的那样)
这实际上涉及与您类似的问题(简化的模拟),
但解决了问题的核心
- 接收输入
- 发生某些事情时删除行并在该行中写入消息
- 重新输入已经编写的内容
这需要输入,只要它是<= 3个字符。
如果写入>= 4个字符,它将执行(3.)对于您来说是完成查询的操作,
然后再次要求输入旧输入。
按下ENTER键时,完成输入
import curses
import curses.ascii as ascii
def getch(stdscr: curses.window):
'return single char'
a = stdscr.get_wch()
stdscr.refresh()
return a
def prompt(stdscr: curses.window):
'write prompt for input'
addstr(stdscr, "Enter query: ")
def addstr(stdscr: curses.window, str):
'write string to window'
stdscr.addstr(str)
stdscr.refresh()
def del_line(stdscr: curses.window):
'deletes line in which cursor is'
row, col = stdscr.getyx()
stdscr.move(row, 0)
stdscr.clrtoeol()
@curses.wrapper
def main(stdscr: curses.window):
stdscr.clear()
curses.echo()
q = ''
while True:
prompt(stdscr)
addstr(stdscr, q)
for i in range(4):
a = getch(stdscr)
if ascii.isalnum(a):
q += a
elif a == '\n' or a == '\r':
stdscr.addstr(f"\nfinished input {q}\n")
q = ''
break
else:
del_line(stdscr)
addstr(stdscr, "Input interupted\n")
return
测试
运行该程序(我建议双击文件以打开标准终端,因为其他终端可能会对此[程序]有所反感)
(E代表ENTER)
并输入:abcE
、abcdefE
、abcdefghijE
查看其效果
P.S.
这可能解决您的问题,但该模块的功能更大,
我不想写太多复杂的API。
解决方案是编写API以轻松管理更多事项,如使用箭头移动,但这不在本问题的范围内。