如何接受箭头键输入或接受方向输入?

JFA*_*JFA 6 python text-editor

这可能是一个xy问题,但我正在尝试构建一个基于内核的文本编辑器,类似于vim或者nano,我知道如何使用转义字符清除屏幕,然后重新打印,我可以让它接受字符,但是我不知道如何让它接受箭头输入导航.我认为它们有ASCII值,但显然不是.有没有办法使用箭头,还是我必须进行导航模式和插入模式vim

我也曾经简单地玩过curses,但这是令人望而却步的,因为据我所知,必须为它打开一个全新的窗口,这与我所拥有的单个终端窗口的视觉不兼容.

编辑:curses也是禁止,因为它清除了窗口,我不想要.

Bak*_*riu 9

curses正是你想要的.事实上,我相信vim实现了与curses的接口.

尝试将以下代码放入名为的文件中test_curses.py:

import curses

screen = curses.initscr()
screen.addstr("Hello World!!!")
screen.refresh()
screen.getch()
curses.endwin()
Run Code Online (Sandbox Code Playgroud)

现在打开一个终端(不是IDLE!一个真正的终端!)并通过以下方式运行它:

python test_curses.py
Run Code Online (Sandbox Code Playgroud)

您应该看到终端被清除并且Hello World!!!出现了一个写作.按任意键,程序将停止,恢复旧的终端内容.

请注意,curses库并不像您习惯的那样简单且"用户友好".我建议阅读教程(不幸的是C语言,但python接口大致相同)

  • @JFA有**为什么库被称为`curses`的原因:你在使用它时通常会诅咒整个世界!它没有用户友好的API.它也是很久以前编写的,当终端和计算机图形很慢时,因此很多API都是在考虑优化的情况下编写的,这在您需要的时候很棒,但在常见情况下会使一切变得更复杂. (2认同)

JFA*_*JFA 4

我最终使用了这个问题中的代码,并修改了__init__语句,以便它在列表中最多接受 3 个字符。

import sys

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

   def __call__(self):# return self.impl()
      charlist = []
      counter = 0
      for i in range(3):
         try:charlist.append(self.impl())
         except:pass
         if charlist[i] not in [chr(27),chr(91)]:#TODO sort out escape vs arrow duh use len()
            break
         if len(charlist) > 1:
            if charlist == [chr(27),chr(27)]:
               break
      if len(charlist) == 3:
         if charlist[2] == 'a'
            return 'u-arr'
         if charlist[2] == 'b'
            return 'd-arr'
         if charlist[2] == 'c'
            return 'r-arr'
         if charlist[2] == 'd'
            return 'l-arr'
      if len(charlist == 2):
         if charlist == [chr(27),chr(27)]
            return chr(27)
      if len(charlist == 1)
         return charlist[0]
      return ''

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)
      finally:
         termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
      return ch
Run Code Online (Sandbox Code Playgroud)

这使我能够从键盘上为编辑器获取箭头键以及所有其他字符和转义序列。它使“Getch”类不再是严格的get char克隆,因为它返回一个字符串,但它最终变得更加有用。