【问题标题】:Read special keys in linux terminal without clearing screen在不清除屏幕的情况下读取 linux 终端中的特殊键
【发布时间】:2014-11-24 15:43:49
【问题描述】:

我有一个程序,我只需要读取 linux 终端(xterm 和控制台)中的特殊键。目前我正在使用curses 来做这件事(尽管我绝对不需要任何其他的诅咒),它工作得很好,除了一个麻烦:我不希望诅咒清除屏幕并更改 CRLF 模式。

也就是说,这段代码可以做到:

stdscr = curses.initscr()
curses.cbreak()
curses.noecho()
stdscr.keypad(1)

while True:
    c = stdscr.getch()
    if c == curses.KEY_UP:
        scroll_up()
    elif c == curses.KEY_DOWN:
        scroll_down()

但复杂的是它会清除屏幕并且看不到终端上以前的内容;后台进程的所有输出也将仅将换行符转换为换行符。

我知道我可以自己将终端变成未煮熟的模式,在ESC 字符之后延迟,等等,但我希望这个程序可以使用特殊键,例如 F1Home 一致,在所有终端上,因此它将是 PITA

所以有什么办法

  • 避免用curses清除屏幕和改变换行模式(我读到可以使用ncurses的函数newterm,但它不是Python实现的),
  • 清除清除后恢复原始屏幕并手动恢复CRLF行为等的任何方式,
  • 还有其他在 Linux 中持续读取特殊键的简单方法吗?

【问题讨论】:

  • 也许看看https://bitbucket.org/pypy/pyrepl。它是基于诅咒的,但不会清除屏幕。
  • 看起来很有趣,但是如何在这里挂钩不是很明显,我应该实例化 UnixConsole 吗?
  • 啊,prepare() 和 get_event()。现在我该如何将换行符改回 CRLF? :D 你想把它变成一个答案吗;)
  • 除非它没有解码箭头键:(

标签: python python-3.x terminal ncurses python-curses


【解决方案1】:

(从 cmets 移出)

也许看看https://bitbucket.org/pypy/pyrepl。它是基于诅咒的,但不会清除屏幕。应用程序pythonipythoni1 提供了一个不使用readline 的Python 提示符,但提供了一个类似的界面,还有一些额外的功能,例如多行编辑(以防我们尝试键入多行命令)。

回答您的最新评论:箭头键在pythonipythoni1 中对我有用...

【讨论】:

  • 我会接受这个答案,因为它确实工作得很好。但是在这种情况下,我们最终改为读取hidraw0 设备。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 2019-10-29
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多