4

質問

ランダム ASCII 文字セレクター関数が 4 を出力するのはなぜですか? また、このコンテキストでの 4 という数字の意味は何ですか? エラー メッセージが表示されないのはなぜですか?

問題は問題を解決する方法ではなく、特定の数値が出力された理由に関するものであることを忘れないでください。

背景とコード

基本的な電子メールクライアントを作成しようとしています。パスワード ボックスに明らかな * の代わりにランダムな文字を表示するのはクールだろうと思いました。そこで、ランダムなアスキー文字を選択する関数を作成しました。

import random
import string

def random_char():

    char_select = random.randrange(52)

    char_choice = string.ascii_letters[char_select]

    return char_choice

これを対話型端末で実行すると、ランダムな文字が吐き出されます。しかし、ウィジェットで実行すると

self.Password = Entry (self, show = lambda: random_char())

私はフォーの束に遭遇しました。

エクストラクレジット

時間があれば、私の関連する質問にアクセスしてください。文字が入力されるたびに、Tkinter エントリ ボックスで関数を繰り返すにはどうすればよいですか?

4

1 に答える 1

1

show パラメータは、コールバックではなく値を受け入れます。Tkinter はコールバック オブジェクトを受け取り、それを文字列に変換しようとしています。これは、入力ボックスに入力したときに得られるものです。

代わりに、バインディングを使用して、入力後にエントリを再構成できます。

def key(event):
    entry.configure(show = random_char())

entry = tk.Entry (self)
entry.pack()
entry.bind("<Key>", key)

編集

Bryan Oakley は、これによりすべての文字が、入力した同じ 1 つのランダムな文字に変更されるという点で正しいです。入力時にさまざまなランダムな文字を表示することは、エントリ ウィジェットの本来の使用方法ではありません。次のようなものを試すことができます:

def key(event):
    global real_password
    global garbage
    current_len = len(v.get())
    if event.char and event.char in string.ascii_letters:
        real_password += event.char
        garbage += random_char()
    garbage = garbage[:current_len]
    v.set(garbage)

v = tk.StringVar()
real_password = ""
garbage = ""
entry = tk.Entry (self, textvariable = v)
entry.pack()
entry.bind("<KeyRelease>", key)

もちろん、多くの制限があります。最後に入力した文字は、キーを押したときではなくキーを離したときに変更されるため、すばやく入力する必要があります:)、カーソル移動キーなどを制御することはできません。しかし、とにかく試してみて楽しかったです.

于 2013-04-20T00:32:11.573 に答える