2016-07-29 217 views
0

我试图构建一个创建密码的gui,并且尽可能地生成密码并使其显示在标签中。然而,当多次点击按钮时,旧密码看起来并不会消失,只是重叠在顶部。我也遇到了一个我似乎无法纠正的错误,尽管它似乎不影响gui。Python Tkinter标签刷新

到目前为止的代码是:

from tkinter import * 
import random 

myGui = Tk() 
myGui.geometry('300x200+700+250') 
myGui.title('Password Generator') 

def passwordgen(): 
    password = '' 

    for i in range(8): 
     ##----runs the for loop 8 times 
     if (i == 0) or (i == 4): 
      password = password + chr(random.randint(97, 122)) 

     if (i == 1) or (i == 5): 
      password = password + chr(random.randint(65, 90)) 

     if (i == 2) or (i == 6): 
      password = password + chr(random.randint(48, 57)) 

     if (i == 3) or (i == 7): 
      password = password + chr(random.randint(33, 47)) 

    passLabel = Label(myGui, text=password) 
    passLabel.grid(row=0, column=1, sticky=E) 

genPassBtn = Button(myGui, text="Generate Password", command=passwordgen) 
genPassBtn.bind("<Button-1>", passwordgen) 
genPassBtn.grid(row=0, column=0, sticky=W) 

myGui.mainloop() 

我收到的错误是:

return self.func(*args) 
TypeError: passwordgen() takes 0 positional arguments but 1 was given 

我希望达到的结果是创建生成密码的GUI,生成一个散列生成密码的值,检查密码强度,将生成的散列加载到文本文件,然后可以根据存储的散列验证密码。

此外,从收到的建议,我修改了代码,并增加了额外的检查力量。现在,该代码如下所示:

from tkinter import * 
import random 

myGui = Tk() 
myGui.geometry('300x200+700+250') 
myGui.title('Password Generator') 

def passwordgen(): 
    password = '' 

    for i in range(8): 
     ##----runs the for loop 8 times 
     if (i == 0) or (i == 4): 
      password = password + chr(random.randint(97, 122)) 

     if (i == 1) or (i == 5): 
      password = password + chr(random.randint(65, 90)) 

     if (i == 2) or (i == 6): 
      password = password + chr(random.randint(48, 57)) 

     if (i == 3) or (i == 7): 
      password = password + chr(random.randint(33, 47)) 

    strPassword.set(password) 


def checkPassword(): 

    strength = ['Blank', 'Very Weak', 'Weak', 'Medium', 'Strong', 'Very Strong'] 
    score = 1 
    password = strPassword.get() 

    if len(password) < 1: 
     return strength[0] 

    if len(password) < 4: 
     return strength[1] 

    if len(password) >= 8: 
     score += 1 

    if re.search('[0-9]', password): 
     score += 1 

    if re.search('[a-z]', password) and re.search('[A-Z]', password): 
     score += 1 

    if re.search('.', password): 
     score += 1 

    passwordStrength.set(strength[score]) 

genPassBtn = Button(myGui, text="Generate Password", command=passwordgen) 
strPassword = StringVar() 

lblPassword = Label(myGui, textvariable=strPassword) 
lblPassword.grid(row=0, column=1, sticky=W) 
genPassBtn.grid(row=0, column=0, sticky=W) 

passwordStrength = StringVar() 
checkStrBtn = Button(myGui, text="Check Strength", command=checkPassword) 
checkStrBtn.grid(row=1, column=0) 

checkStrLab = Label(myGui, textvariable=passwordStrength) 
checkStrLab.grid(row=1, column=1) 

myGui.mainloop() 

回答

2

试试这个例子。

from tkinter import * 
import random 

myGui = Tk() 
myGui.geometry('300x200+700+250') 
myGui.title('Password Generator') 

def passwordgen(): 
    password = '' 

    for i in range(8): 
     ##----runs the for loop 8 times 
     if (i == 0) or (i == 4): 
      password = password + chr(random.randint(97, 122)) 

     if (i == 1) or (i == 5): 
      password = password + chr(random.randint(65, 90)) 

     if (i == 2) or (i == 6): 
      password = password + chr(random.randint(48, 57)) 

     if (i == 3) or (i == 7): 
      password = password + chr(random.randint(33, 47)) 

    strPassword.set(password) 

genPassBtn = Button(myGui, text="Generate Password", command=passwordgen) 
strPassword = StringVar() 
lblPassword = Label(myGui, textvariable=strPassword) 
lblPassword.grid(row=0,column=1, sticky=W) 
genPassBtn.grid(row=0, column=0, sticky=W) 

myGui.mainloop() 

这里是我做了什么

  1. 而不是每次都创建一个新的标签,我更改使用STRINGVAR一个标签叫strPassword的文本。
  2. 你不需要将一个按钮绑定到一个点击来调用一个函数,使用Button(...,command = myFunction)已经这样做了。
+0

非常感谢斯科蒂。我现在可以使用strPassword并检查强度吗? – JSmith

+0

我不确定你的意思是什么,但你可以使用strPassword.get()返回字符串的内容以用于其他目的 – scotty3785

+0

我想说这个密码非常弱,弱,中,强等。 aginst一组参数,如小写,大写,数字或特殊字符。 – JSmith