解释stdscr中的“ENTER”按键(Python中的curses模块)

时间:2015-08-27 14:53:08

标签: python python-2.7 python-3.x curses python-curses

我正在使用Python的curses模块。 在stdscr中,每当我按下回车键,诅咒就会移动到同一行的第一列。我有几个问题。

  1. 这是什么原因?
  2. 有没有办法将诅咒移到下一行?
  3. 如果我想在输入按键时执行某些操作(执行某些功能或其他操作),那么“if”条件会出现什么情况? e.g。

    if (condition which will determine if ENTER was pressed or not)
        somecode
    

1 个答案:

答案 0 :(得分:4)

  
    

这是什么原因?

  

您需要在初始化过程中调用curses.noecho()

  
    

有没有办法将诅咒移到下一行?

  

stdscr.move(y,x)将移至绝对位置。 stdscr.getyx()会告诉您当前的位置。

  
    

如果我想在输入按键时执行某些操作(执行某些功能或其他操作),那么会出现什么情况?如果条件是什么? e.g。

  

您认为可以致电getch()并将结果与​​KEY_ENTER进行比较。实际上,您需要检查更多值。根据您的终端设置,您使用的库以及月亮的相位,您可能需要检查换行符(aka \n,^ J,ASCII 10)或回车符(\r,^ M ,ASCII 13)。

c = stdscr.getch()
if c == curses.KEY_ENTER or c == 10 or c == 13:
    # I hit ENTER

示例程序:

import curses

# Thanks, http://www.ipsum-generator.com
ipsum = '''Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla
quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent
mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum
lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent
per conubia nostra, per inceptos himenaeos.'''

try:
    # Standard startup. Probably don't need to change this
    stdscr = curses.initscr()
    curses.cbreak()
    curses.noecho()
    stdscr.keypad(1)

    # Silly program to write to the screen,
    # wait for either <ENTER> or <Q>.
    # On <ENTER>, mess with the screen.
    # On <Q>, exit.
    stdscr.addstr(0, 0, ipsum)
    stdscr.move(0, 0)
    stdscr.refresh()
    i = 0
    j = 0

    while 1:
        c = stdscr.getch()
        if c == ord('q'):
            exit(0)
        if c == curses.KEY_ENTER or c == 10 or c == 13:
            i += 1
            if i % 3 == 0:
                stdscr.addstr(0, 0, ipsum.lower())
            if i % 3 == 1:
                stdscr.addstr(0, 0, ipsum.upper())
            if i % 3 == 2:
                stdscr.addstr(0, 0, ipsum)
            stdscr.move(0, 0)
        if c == curses.KEY_DOWN:
            y, x = stdscr.getyx()
            maxy, maxx = stdscr.getmaxyx()
            stdscr.move((y+1) % maxy, x)
        stdscr.refresh()


finally:
    # Standard shutdown. Probably don't need to change this.
    curses.nocbreak()
    stdscr.keypad(0)
    curses.echo()
    curses.endwin()

参考: