Curses - 如何插入INPUT项目的预定义名称?

时间:2015-05-29 16:32:43

标签: curses python-curses

如何请插入INPUT项目的预定义名称?

我的努力:(信息:角色" _"是光标)

def Edit_Item(stdscr, item_name)
    stdscr.addstr(1, 2, "Item Name:")
    r = stdscr.getstr(2, 16, 15)
    return r

Edit_Item(stdscr, 'Foo')
Edit_Item(stdscr, 'Bar')

结果:

Item Name: _
Item Name: _

期望的结果:

Item Name: Foo_
Item Name: Bar_

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

window.getstr函数从键盘读取新数据(并将其放入屏幕)。也许您的意思是window.instr,因为您似乎可以假设您可以回读addstr来电中添加的数据。

示例函数中未使用参数item_name。您可以使用window.addstr将其写入屏幕,以及填充下划线(未完成)。你可以做到这一点:

def Edit_Item(stdscr, item_name)
    stdscr.addstr(1, 2, "Item Name:" + item_name + "_" )
    r = stdscr.getstr(2, 16, 15)
    return r

给出的示例首先将光标移动到屏幕上的2,16过去 item_name的位置 - 在第10列)。 stdscr.getstr调用不会返回item_name的值;它将仅返回 您使用键盘输入的字符。如上所述,window.instr提供了一种结合item_namestdscr.getstr调用值的方法。

然而,即使这种组合还不够,因为stdscr.getstr将从起点返回字符。因此,您无法在使用addstr写入的值的末尾启动调用。如果你这样做:

def Edit_Item(stdscr, item_name)
    stdscr.addstr(1, 2, "Item Name:" + item_name + "_" )
    r = stdscr.getstr(2, 10, 15)
    r = stdscr.instr(2, 10, 15)
    return r

它会更接近你的意图,但是(未经测试)当你按 enter 时,可能会删除光标位置后面的字符。如果您修改了使用getch的解决方案,则可以决定要回显的内容,以及处理编辑行中左/右光标移动等内容。编辑模板字符串等奇特的东西通常是用更简单的函数构建的。

答案 1 :(得分:0)

@Thomas Dickey: 不:-(我会尽力更好地描述我需要的东西..

- Call function 'Edit_Item' with parameter 'Foo'           # OK
- The screen prints 'Item Name: Foo'                       # OK
- Cursor is now behind the word 'Foo_'                     # OK
- Press the key arrow left (2x) to change the cursor 'F_o' # Not work
- Edit word 'Foo' to 'Fao'

这是明白的吗?

################

这正是我在诅咒中需要做的事情。

Bash中的演示

read -e -i "Foo" -p "Edit Item Name: " ITEM

答案 2 :(得分:0)

我通常这样做:

import curses
screen = curses.initscr()
curses.noecho()
curses.cbreak()
curses.start_color()
screen.keypad( 1 )
screen.border( 0 )
curses.curs_set( 2 )
string = "Foo"
max_len = 40 #max len of string
screen.addstr( 3, 1, "Item Name: " )
screen.addstr( 3, 12, string )
screen.refresh()
position = len( string )
x = screen.getch( 3, 12 + position )
while x != 27:
    if (x <= 122 and x >= 97) or x == 32 or (x <= 90 and x >= 65):
        if position == len( string ):
            if len( string ) < max_len:
                string += chr( x )
                position = len( string )
        else:
            string = string[ 0:position ] + chr( x ) + string[ position + 1: ]
    if x == 263:
        if position == len( string ):
            string = string[ 0:len( string ) - 1 ]
            position = len( string )
        else:
            string = string[ 0:position -1 ] + string[ position: ]
            if position > 0:
                position -= 1
    if x == 330:
        if position == len( string ) - 1:
            string = string[ 0:len( string ) - 1 ]
        else:
            string = string[ 0:position +1] + string[ position + 2: ]
    if x == curses.KEY_RIGHT:
        if position < len( string ):
            position += 1
    if x == curses.KEY_LEFT:
        if position > 0:
            position -= 1  

    screen.erase()
    screen.border( 0 )
    screen.addstr( 3, 1, "Item Name: " )
    screen.addstr( 3, 12, string )
    x = screen.getch( 3, 12 + position )

curses.endwin()
exit()