Значение переменной (которая не является кортежем) не меняется в Tkinter Python - PullRequest
0 голосов
/ 24 апреля 2020

Я создаю программу Tkinter, которая может сгенерировать для вас случайный пароль и сохранить вашу регистрационную информацию для любого веб-сайта или для более позднего использования. Он генерирует вам пароль, запрашивает ваше имя пользователя (под которым вы зарегистрировались) и имя веб-сайта (где вы создали учетную запись), чтобы он мог хранить его. После этого вы можете искать информацию для входа в систему с помощью этой программы, если вы снова заходите на сайт. Я пытаюсь добавить функцию пользовательского пароля, которая хранит ваш собственный пароль вместо хранения случайного пароля.

import tkinter as tk 
import random

window = tk.Tk()

window.title("Password generator") #Window title
window.geometry("450x300") #Window Size

#Random characters to create a password

one = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
two = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
three = ['1','2','3','4','5','6','7','8','9','0']
four = ['~','@','!','#','$','%','^','&','*','(',')','-','_','=','+',':',';',',','.','<','>','/','?']
five = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
six = ['1','2','3','4','5','6','7','8','9','0']
seven = ['~','@','!','#','$','%','^','&','*','(',')','-','_','=','+',':',';',',','.','<','>','/','?']
eight = ['~','@','!','#','$','%','^','&','*','(',')','-','_','=','+',':',';',',','.','<','>','/','?']
nine = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
ten = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']

a = one[random.randint(0, 25)]
b = two[random.randint(0, 25)]
c = three[random.randint(0, 9)]
d = four[random.randint(0, 22)]
e = five[random.randint(0, 25)]
f = six[random.randint(0, 9)]
g = seven[random.randint(0, 22)]
h = eight[random.randint(0, 22)]
i = nine[random.randint(0, 25)]
j = ten[random.randint(0, 25)]

x = a+b+c+d+e+f+g+h+i+j #Password(Includes various characters)


Generate = tk.Label(text="Here is your randomly generated password:") 
Generate.grid(column=3, row=3) 

UserName = tk.StringVar() #Make Username and website containing variables
WebSite = tk.StringVar()

passw = tk.Label(text=x) #Display the password
passw.grid(column=3, row=4)

UserN = tk.Label(text="Username/Email") 
UserN.grid(column=2, row=5)

username = tk.Entry(window, width=30, textvariable=UserName) #Take in the username and store it
username.grid(column=3, row=5)
WebS = tk.Label(text="Website Name") #Take in the website name and store it
WebS.grid(column=2, row=6)

website = tk.Entry(window, width=30, textvariable=WebSite) #Take in the website name and store it
website.grid(column=3, row=6)



def storeinfo(): #Store the information in a .txt file
    with open("LoginInfo.txt", "a") as logininfo:
        logininfo.write('%s,%s,%s\n' % (WebSite.get(), UserName.get(), x))
        savesuccess = tk.Label(text="Save successful!", fg="Purple")
        savesuccess.grid(column=4, row=8)

save = tk.Button(text="Save Info", command=storeinfo) #Button to execute command
save.grid(column=3, row=8)



#Search for your login info 

searchentry = tk.StringVar() #Store the user's entry(The website name only)

searchent = tk.Entry(textvariable=searchentry) #Take in the website name
searchent.grid(column=3, row=11)



def search(): #Command to search
    with open("LoginInfo.txt") as fo:
        for rec in fo:
            tokens = rec.strip().split(',', 2) # split to maximum three tokens
            if tokens[0] == searchentry.get(): #If the website name(which is first in the list)is equal to searchentry
                searches = tk.Label(text=rec) #Give out the entire list
                searches.grid(column=3, row=12)


searchbutton = tk.Button( width=10, text="search", command=search) #Button to execute search command
searchbutton.grid(column=4, row=11)

def custompass(): #If the user already has a password and just wishes to just store it
    anc = tk.StringVar()
    custompass1 = tk.Entry(text="Add a custom password", textvariable=x) #Store the custom password in x
    custompass1.grid(column=3, row=15)
    custompasslabel1 = tk.Label(text="Password: ")
    custompasslabel1.grid(column=2, row=15)
    custompass2 = tk.Entry(text="Add Username/Email", textvariable=UserName) #Store the username in UserName
    custompass2.grid(column=3, row=16)
    custompasslabel2 = tk.Label(text="Username/Email: ")
    custompasslabel2.grid(column=2, row=16)
    custompass3 = tk.Entry(text="Add website name", textvariable=WebSite) #Store the website name in WebSite
    custompass3.grid(column=3, row=17)
    custompasslabel1 = tk.Label(text="Website: ")
    custompasslabel1.grid(column=2, row=17)
    submitbutton = tk.Button(text="Submit", command=storeinfo) #Button to execute storeinfo command 
    submitbutton.grid(column=3, row=18)
    storeinfo()



custompassb = tk.Button(text="Add a custom password", command=custompass) #Button to start the custompass command
custompassb.grid(column=3, row=14)

window.mainloop()

В функции custompass () я пытаюсь изменить значение x на ввод пользователя, а затем запускаю функцию storeinfo () для сохранения информации в файле .txt, но этого не происходит , Вместо этого он хранит случайный пароль.

Спасибо

1 Ответ

1 голос
/ 24 апреля 2020

Ваш метод storeinfo() всегда хранит x, который является комбинацией ваших "случайных" символов пароля. Почему ваш custompass() всегда так или иначе вызывает storeinfo()?

Измените вызов кнопки на другой метод при нажатии кнопки, который считывает пароль пользователя и предоставляет его для измененного storeinfo метода:

def storeCustomPw(): # use that from your custom function
    storeinfo(custompass1.get()) 

Измените storeinfo:

def storeinfo(pw = None):
    # store x if no pw was given
    if pw is None:
        pw = x

    with open("LoginInfo.txt", "a") as logininfo:
        logininfo.write('%s,%s,%s\n' % (WebSite.get(), UserName.get(), pw))  # save pw
        savesuccess = tk.Label(text="Save successful!", fg="Purple")
        savesuccess.grid(column=4, row=8)

и, при необходимости, вызовите его там, где необходимо, предоставив вещь для хранения.

Вы также можете посмотреть функции привязки с параметром для кнопки. : этот ответ охватывает это.


С точки зрения безопасности ограничение каждого n-го символа только одним видом ввода снижает качество пароля, но я предполагаю, что это просто "Я" проект на данный момент.

Вам также следует заглянуть в модуль string и random, чтобы сделать ваш код лучше:

import random
from string import ascii_lowercase, ascii_uppercase, digits

a = random.choice(ascii_lowercase)
b = random.choice(ascii_uppercase)
c = random.choice(digits)
print(a+b+c)

#  or use loops of "sources" and combine them like so
source = [ascii_lowercase, ascii_uppercase, digits, digits, 
          ascii_uppercase, ascii_uppercase]
pw = ''.join( random.choice(w) for w in source )

print(pw)

Вывод:

sV6
eF77QS

См. :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...