【问题标题】:Every letter that is typed call on fuction键入的每个字母都调用函数
【发布时间】:2021-05-12 17:59:04
【问题描述】:

我在下面有一个代码,它对输入框中的密码进行评分。我想让score 每次在输入框中输入一个字母时调用命令,但它不起作用但它没有返回任何错误。有人可以帮我吗?

from tkinter import *
import re

def showPassword(entry_box):
    entry_box.config(show = '')

def hidePassword(entry_box):
    entry_box.config(show = '*')

def addScore(l):
    global score
    for i in l:
        if len(i) > 0:
            score += 5
            
def minusScore(l):
    global score
    for i in l:
        if len(i) == len(password.get()):
            score -= 5
    
def Scoring():
    text = passwordText.get()
    if len(text) > 24 or len(text) < 8:
        l.config(text = 'Length of password must be between 8 and 24')
    else:
        a = re.findall("[^a-zA-Z0-9!\"£$%^&*()_+-=]", text)
        if len(a) != 0:
            l.config(text = 'Invalid character has been used.\nPlease see bottom right.')
        else:
            global score
            score = len(text)
            lowercase = re.findall("[a-z]", text)
            uppercase = re.findall("[A-Z]", text)
            digits = re.findall("[0-9]", text)
            specialCharacters = re.findall("[!$%^&*()-_=+]", text)
            addScore([lowercase, uppercase, digits, specialCharacters])
            if score - len(text) == 20:
                score += 15
            minusScore([lowercase, uppercase, digits])
            pattern = ['q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m']
            pattern_freq = []
            for i in pattern:
                ind = pattern.index(i)
                if ind != 0 and ind != 25:
                    curr = pattern[ind-1]+i+pattern[ind+1]
                    pattern_freq.append(re.findall(curr, text.lower()))
            print(pattern_freq)
            for i in pattern_freq:
                for a in i:
                    score -= 5
                    print('Minus 5 patten')
            slider.set(score)
            if score > 20:
                l.config(text = 'Strong password')
                    
root = Tk()
root.title('Password generator')
passwordText = StringVar()
passwordText.trace("w", callback = lambda name, index, mode: Scoring)
password = Entry(root, show = '*', textvariable = passwordText)
lab = Label(root, text = 'Password:')
password.grid(row = 0, column = 1, padx = 2)
lab.grid(row = 0, column = 0, padx = 2, pady = 2)
generate = Button(root, text = 'Generate password')
slider = Scale(root, from_ = -120, to = 60, orient = 'horizontal', length = 150)
slider.grid(row = 1, columnspan = 3)
generate.grid(row = 2, columnspan = 3, pady = 3)
l = Label(root, text = '')
l.grid(row = 3, columnspan = 3)
show = Button(root, text = 'Show')
show.bind("<ButtonPress-1>", lambda event: showPassword(password))
show.bind("<ButtonRelease-1>", lambda event: hidePassword(password))
show.grid(row = 0, column = 2, padx = 2)
info = Button(root, text = 'i')

【问题讨论】:

  • 你做过研究吗?基于事件调用函数的方法有文献记载,网上的例子数不胜数。当可以从可用文档中回答问题时,不清楚为什么您需要我们的帮助。
  • 抱歉我没有指定问题我已经编辑了我的问题。
  • 您尝试使用 score 作为全局变量和函数的名称 - 这肯定行不通。
  • 我已经编辑了我的答案,但我又试了一次,这似乎不是问题

标签: python python-3.x tkinter tkinter-entry


【解决方案1】:

您的lambda 函数没有调用Scoring 函数。就个人而言,我认为没有任何理由使用 lambda。如果你使用它,你必须确保 lambda 函数调用你的评分函数(例如:Scoring() vs Scoring

passwordText.trace("w", callback = lambda name, index, mode: Scoring())

或者,直接调用函数。您需要让函数接受跟踪发送的参数。

def Scoring(*args):
    ...
...
passwordText.trace("w", callback = Scoring)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2020-11-05
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多