4

问题

为什么我的随机 ascii 字符选择器函数会输出四,数字四在这种情况下的意义是什么?为什么我没有收到错误消息?

请记住,问题在于如何解决问题,而在于为什么输出该特定数字。

背景和代码

我正在尝试创建一个基本的电子邮件客户端。我认为让我的密码框显示随机字符而不是明显的 *. 因此,我创建了一个选择随机 ascii 字母的函数。

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 是正确的,因为这将在您键入时将所有字符更改为相同的单个随机字符。在您键入时显示不同的随机字符不是您应该使用 Entry 小部件的方式。您可以尝试以下方法:

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 回答