0

非常に単純なスクリプトを準備しており、ユーザーが特定の値を入力する必要があります。ある時点で、ユーザー入力が DELETE キー (ユーザーが DELETE キーを押してから Enter キーを押す) の場合、既存の値を再利用するか削除する機会を提供したいと考えていますが、満足のいく答えを見つけることができないようです。 (これはかなり驚くべきことです...)これは単なるヘルパースクリプトなので、PyHookなどのより高度なものを避けようとしていました。

これは私が興味を持っているチャンクです:

if reusable_params:
    for key in list(k for k in config_dict.keys() if k not in ["mac", "base_url", "command_name"]):
        msg = "Enter new value for parameter {0}. Press ENTER to reuse the previous {1}. Press DELETE+ENTER to remove this key.".format(key, config_dict[key])
        input = unicode(raw_input(msg).strip().decode(sys.stdin.encoding))
        logging.debug("input: %s, len(input) %s" % (input, len(input))

DELETE+Enter を押すと、Unicode に見える 4 文字の文字列が返されます。

ここに画像の説明を入力

前もって感謝します!

4

2 に答える 2

1

あなたの cmd ウィンドウは、ソフトウェア、つまりコンピュータ プログラムです。コマンド ウィンドウで削除キーを押すと、コマンド ウィンドウは、それまでに入力されたすべてのキー ストロークを格納する配列、つまり入力バッファーに削除キーの ASCII コード (127) を追加しないようにプログラムされています。代わりに、delete キーを押すと、コマンド ウィンドウは配列から最後のキー ストロークを削除するようにプログラムされています。次のように簡単です。

key_strokes = []

#get key_code

if key_code == 127:
    key_strokes.pop()
else:
    key_strokes.append(key_code)

問題は、cmd ウィンドウを生成したプログラムを制御して、その動作を変更する必要があることです。

最も簡単な解決策は、削除キーを押す代わりに、ユーザーに削除の 'd' を入力させることです。

それ以外の場合は、ユーザーが入力したキー ストロークをキャプチャする必要があります。キー ストロークに応答する (そして Enter キーを待たない) 最善かつ最も生産的な方法は、Tkinter について学ぶことです。作成したウィンドウ (GUI と呼ばれるもの) をユーザーに表示し、ユーザーが削除キーを押したときに必要なことを実行するようにプログラムできます。

import Tkinter as tk

root = tk.Tk()
root.geometry("300x200")

entry = tk.Entry(root)
entry.pack()

def get_key(event):
    print "You pressed", repr(event.char)
entry.bind("<Key>", get_key)

root.mainloop()

同様のことを行う別の方法は、curses モジュールを使用することですが、これは膨大な時間の無駄です。呪いの整理に費やす時間は、Tkinter の学習に費やすほうがよいでしょう。

さて、ここであなたのコードで何が起こっているのですか:

list(k for k in config_dict.keys() if k not in ["mac", "base_url", "command_name"]):

ジェネレーターを作成し、ジェネレーターからリストを抽出した後、すぐに破棄するのはなぜですか? ジェネレーターステップをなくすと何が問題になるのですか:

[
    k for k in config_dict.keys() 
    if k not in ["mac", "base_url", "command_name"]
]

また、リストの代わりに「nots」のセットを使用すると、さらに効率的になります。リスト全体を検索する必要があるのは、1 回の辞書検索ほど効率的ではありません。

[
    k for k in config_dict.keys() 
    if k not in set(["mac", "base_url", "command_name"])
]
于 2013-08-16T16:00:19.007 に答える