2

ユーザー名とパスワードの入力を求めるアプリケーションがあります。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 で、Enter 文字は 10 ですが、上記のコードでは、他のすべてのキーは引き続き正しく処理されますが、Enter キーを押すと、終了する代わりに改行が表示されます。テキストボックスの編集モード。私は何を間違っていますか?

4

3 に答える 3

6

ドキュメントでこれを見つけました:

バリデーターが提供される場合、それは関数でなければなりません。これは、キーストロークをパラメータとして入力されたキーストロークごとに呼び出されます。コマンドディスパッチは結果に対して行われます。

したがって、tb.do_command自分で実行する代わりに、「入力」したいキーを返すだけです。

def enter_is_terminate(x):
    if x == 10:
        return 7

また、グローバル変数として定義する必要がなくなりましtbた。これは通常は良いことです。:)


1 行の入力だけで満足する場合は、自分でエンター キーを処理する必要はありません。

ドキュメントには、次のように書かれています。

Control-J -- ウィンドウが 1 行の場合は終了し、そうでない場合は改行を挿入します。

したがって、テキストボックスのサブウィンドウを行数 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()

またsub、特定の行と列の数を指定して、境界線がテキストボックスの周りにうまく収まるようにしました。

于 2016-03-21T08:11:58.893 に答える
6

ソースコードを読むのに役立ちます。これが有効なバリデータです:

def enter_is_terminate(x):
    if x == 10:
        x = 7
    return x

editバリデーターは、関数がチェックする文字を返す必要がありdo_commandます。

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_command(a) ASCII BEL と (b) 1 行ウィンドウの改行の 2 つのケースでのみ 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)
于 2016-03-21T08:46:19.380 に答える