2

楽しみのために基本的なメールクライアントを作成しようとしています。パスワードボックスにランダムな文字が表示されると面白いと思いました。私はすでにランダムな文字を作成する機能を持っています:

import string
import random



def random_char():

    ascii = string.ascii_letters
    total = len(string.ascii_letters)
    char_select = random.randrange(total)

    char_choice = char_set[char_select]

    return char_choice

しかし問題は、これが一度しか実行されず、プログラムがその文字を無期限に繰り返すことです。

    self.Password = Entry (self, show = lambda: random_char())
    self.Password.grid(row = 1, column = 1)

文字が入力されるたびに Entry ウィジェットに関数を再実行させるにはどうすればよいですか?

4

1 に答える 1

1

残念ながら、ウィジェットのshow属性はEntryそのようには機能しません。お気づきのように、入力された文字ではなく、表示する単一の文字を指定するだけです。

Entry必要な効果を得るには、ウィジェットでのキーの押下をインターセプトし、翻訳する必要があります。ただし、本当に必要なキーのみを変更し、他のキー (特に、Return、Delete、矢印キーなど) を残すように注意する必要があります。Entry ボックスのすべてのキー押下イベントにコールバックをバインドすることで、これを行うことができます。

self.Password.bind("<Key>", callback)

ここでcallback()、それがアスキー文字 (数値が変更されずに通過することを意味します) の場合にランダム関数を呼び出し、ランダム文字を挿入し、特別なbreak文字列定数を返して、このイベントの処理がこれ以上行われないことを示すように定義されています):

def callback(event):
    if event.char in string.ascii_letters:
        event.widget.insert(END, random_char())
        return "break"
于 2013-04-20T05:31:56.047 に答える