Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python诅咒:使回车键终止文本框?_Python_Ncurses_Curses_Python Curses - Fatal编程技术网

Python诅咒:使回车键终止文本框?

Python诅咒:使回车键终止文本框?,python,ncurses,curses,python-curses,Python,Ncurses,Curses,Python Curses,我有一个应用程序,要求人们输入他们的用户名和密码。我希望他们能够只按enter键发送姓名和密码。为此,我做了以下几点: import curses, curses.textpad def setup_input(): inp = curses.newwin(8,55, 0,0) inp.addstr(1,1, "Please enter your username:") sub = inp.subwin(2,1) sub.border() sub2 = s

我有一个应用程序,要求人们输入他们的用户名和密码。我希望他们能够只按enter键发送姓名和密码。为此,我做了以下几点:

import curses, curses.textpad
def setup_input():
    inp = curses.newwin(8,55, 0,0)
    inp.addstr(1,1, "Please enter your username:")
    sub = inp.subwin(2,1)
    sub.border()
    sub2 = sub.subwin(3,2)
    global tb
    tb = curses.textpad.Textbox(sub2)
    inp.refresh()
    tb.edit(enter_is_terminate)

def enter_is_terminate(x):
    if x == 10:
        tb.do_command(7)
    tb.do_command(x)

setup_input()
不幸的是,这并不像预期的那样有效。终止的标准字符(由CTRL+G触发)为7,输入字符为10,但使用上述代码,所有其他键仍能正确处理,但当我按enter键时,它只会给我一个换行符,而不是终止文本框的编辑模式。我做错了什么?

如果提供了验证器,则它必须是一个函数。对于以击键作为参数输入的每个击键,都将调用它;对结果执行命令分派

因此,不要自己运行
tb.do_命令
,只需返回要“输入”的键即可

def enter_is_terminate(x):
    if x == 10:
        return 7
另外,现在不需要将
tb
定义为全局变量,这通常是一件好事。:)


如果您只需要一行输入,就不必自己处理enter键

def setup_input():
    inp = curses.newwin(8,55, 0,0)
    inp.addstr(1,1, "Please enter your username:")
    sub = inp.subwin(3, 41, 2, 1)
    sub.border()
    sub2 = sub.subwin(1, 40, 3, 2)
    tb = curses.textpad.Textbox(sub2)
    inp.refresh()
    tb.edit()
上面写着:

Control-J——如果窗口为1行,则终止,否则插入换行符

因此,如果您不需要自己处理enter键

def setup_input():
    inp = curses.newwin(8,55, 0,0)
    inp.addstr(1,1, "Please enter your username:")
    sub = inp.subwin(3, 41, 2, 1)
    sub.border()
    sub2 = sub.subwin(1, 40, 3, 2)
    tb = curses.textpad.Textbox(sub2)
    inp.refresh()
    tb.edit()

我还给
指定了一行和列数,因此文本框周围的边框很好。

这有助于阅读源代码。下面是一个有效的验证器:

def enter_is_terminate(x):
    if x == 10:
        x = 7
    return x
验证器必须返回一个字符,
edit
函数使用
do\u命令检查该字符:

def edit(self, validate=None):
    "Edit in the widget window and collect the results."
    while 1:            
        ch = self.win.getch()
        if validate:  
            ch = validate(ch)
        if not ch:      
            continue
        if not self.do_command(ch):
            break             
        self.win.refresh() 
    return self.gather()
do_命令
对于单行窗口中的两种情况(a)ASCII BEL和(b)换行符,仅返回0:

    elif ch == curses.ascii.BEL:                           # ^g
        return 0
    elif ch == curses.ascii.NL:                            # ^j
        if self.maxy == 0:
            return 0
        elif y < self.maxy:
            self.win.move(y+1, 0)
elif ch==curses.ascii.BEL:#^g
返回0
elif ch==curses.ascii.NL:#^j
如果self.maxy==0:
返回0
elif y
也许我的解决方案会有所帮助,我制作了一个文本框,可通过按enter键终止,所以您可以用它做任何您想做的事情n hv fun:-

def txtpnl(stdscr, y=10, xl=10, wl=20, HIDE_WORDS = False):
    wl += xl + 2
    s = ''
    textpad.rectangle(stdscr, y, xl, y + 2, wl)
    stdscr.addstr(y + 1, xl + 1, '')
    cp = 0
    while True:
        textpad.rectangle(stdscr, y, xl, y + 2, wl)
        stdscr.addstr(y + 1, xl + 1 + cp, '')
        k = stdscr.getch()
        if k == KEY_ENTER or k in [10, 13]:
            break
        elif k == KEY_UP or k == KEY_DOWN:
            pass
        elif k == KEY_BACKSPACE or k == 8:
            if cp > 0: cp -= 1
            stdscr.addstr(y + 1, xl + 1, " " * len(s))
            s = s[:cp]+s[cp+1:]
            if HIDE_WORDS:
                stdscr.addstr(y + 1, xl + 1 + cp, "*"*len(s[cp:]))
                stdscr.addstr(y + 1, xl + 1, "*"*len(s[:cp]))
            else:
                stdscr.addstr(y + 1, xl + 1 + cp, s[cp:])
                stdscr.addstr(y + 1, xl + 1, s[:cp])

        elif k == KEY_LEFT or k == 27:
            if not cp:
                pass
            else:
                cp -= 1
                if HIDE_WORDS:
                    stdscr.addstr(y + 1, xl + 1 + cp, "*"*len(s[cp:]))
                    stdscr.addstr(y + 1, xl + 1, "*"*len(s[:cp]))
                else:
                    stdscr.addstr(y + 1, xl + 1 + cp, s[cp:])
                    stdscr.addstr(y + 1, xl + 1, s[:cp])
        elif k == KEY_RIGHT or k == 26:
            if cp == len(s):
                pass
            else:
                cp += 1
                if HIDE_WORDS:
                    stdscr.addstr(y + 1, xl + 1 + cp, "*"*len(s[cp:]))
                    stdscr.addstr(y + 1, xl + 1, "*"*len(s[:cp]))
                else:
                    stdscr.addstr(y + 1, xl + 1 + cp, s[cp:])
                    stdscr.addstr(y + 1, xl + 1, s[:cp])
        elif k in [KEY_DC, 127]:
            if HIDE_WORDS:
                stdscr.addstr(y + 1, xl + 1 + cp, "*"*len(s[cp + 1:] + " "))
                stdscr.addstr(y + 1, xl + 1, "*"*len(s[:cp]))
            else:
                stdscr.addstr(y + 1, xl + 1 + cp, s[cp + 1:] + " ")
                stdscr.addstr(y + 1, xl + 1, s[:cp])
            s = s[:cp] + s[cp + 1:]
        else:
            if len(s) < wl - xl - 2:
                if cp == len(s):
                    s += str(chr(k))
                    if HIDE_WORDS:
                        stdscr.addstr(y + 1, xl + 1, "*"*len(s))
                    else:
                        stdscr.addstr(y + 1, xl + 1, s)
                else:
                    s = s[:cp] + str(chr(k)) + s[cp:]
                    if HIDE_WORDS:
                        stdscr.addstr(y + 1, xl + 1 + len(s[:cp + 1]), "*"*len(s[cp + 1:]))
                        stdscr.addstr(y + 1, xl + 1, "*"*len(s[:cp + 1]))
                    else:
                        stdscr.addstr(y + 1, xl + 1 + len(s[:cp + 1]), s[cp + 1:])
                        stdscr.addstr(y + 1, xl + 1, s[:cp + 1])
                cp += 1
    return s
def txtpnl(stdscr,y=10,xl=10,wl=20,HIDE_WORDS=False):
wl+=xl+2
s=“”
textpad.矩形(stdscr,y,xl,y+2,wl)
stdscr.addstr(y+1,xl+1,')
cp=0
尽管如此:
textpad.矩形(stdscr,y,xl,y+2,wl)
stdscr.addstr(y+1,xl+1+cp,“”)
k=stdscr.getch()
如果k==键,则在[10,13]中输入或输入k:
打破
elif k==键向上或k==键向下:
通过
elif k==键\u退格或k==8:
如果cp>0:cp-=1
标准偏差加总偏差(y+1,xl+1,“*len)
s=s[:cp]+s[cp+1:]
如果隐藏单词:
stdscr.addstr(y+1,xl+1+cp,“*”*len(s[cp:]))
stdscr.addstr(y+1,xl+1,“*”*len(s[:cp]))
其他:
stdscr.addstr(y+1,xl+1+cp,s[cp:]
stdscr.addstr(y+1,xl+1,s[:cp])
elif k==左键或k==27:
如果不是cp:
通过
其他:
cp-=1
如果隐藏单词:
stdscr.addstr(y+1,xl+1+cp,“*”*len(s[cp:]))
stdscr.addstr(y+1,xl+1,“*”*len(s[:cp]))
其他:
stdscr.addstr(y+1,xl+1+cp,s[cp:]
stdscr.addstr(y+1,xl+1,s[:cp])
elif k==右键或k==26:
如果cp==len(s):
通过
其他:
cp+=1
如果隐藏单词:
stdscr.addstr(y+1,xl+1+cp,“*”*len(s[cp:]))
stdscr.addstr(y+1,xl+1,“*”*len(s[:cp]))
其他:
stdscr.addstr(y+1,xl+1+cp,s[cp:]
stdscr.addstr(y+1,xl+1,s[:cp])
elif k in[KEY_DC,127]:
如果隐藏单词:
stdscr.addstr(y+1,xl+1+cp,“*”*len(s[cp+1:][+”)
stdscr.addstr(y+1,xl+1,“*”*len(s[:cp]))
其他:
stdscr.addstr(y+1,xl+1+cp,s[cp+1:][+”)
stdscr.addstr(y+1,xl+1,s[:cp])
s=s[:cp]+s[cp+1:]
其他:
如果透镜