Script:
import secrets
import string
import time
allPasswords = []
sidenames = []
generalpassword = ""
def genpas():
los = string.digits + string.ascii_letters + string.punctuation
newpass = ''.join(secrets.choice(los) for _ in range(40))
return newpass
def passwordsaver():
print("")
print("-----------------Menu-----------------")
print("1. Create new Password")
print("2. Show Passwords")
print("3. Generate only a Password")
print("Q. Quit")
print("--------------------------------------")
print("")
menuAnswer = input("")
zwischenspeicher = []
if menuAnswer == "1":
Site = input("Write the Sidename\n") + " / "
Username = input("Write your Username\n") + " / "
if Username == "":
Username = "Username"
Email = input("Write your E-mail\n") + " / "
Password = genpas()
# zwischenspeicher.append(Site + Username + Email + Password)
# allPasswords.extend(zwischenspeicher)
allPasswords.append(Site + Username + Email + Password)
print("Site/username/e-mail/password")
print(allPasswords)
passwordsaver()
elif menuAnswer == "2":
print(" Sidename | Username | E-Mail | Password |")
print("--------------+--------------+------------------+--------------------------------------------+")
x=0
aha = len(allPasswords) /4
while x <= aha:
eins = 1 + (x*4)
zwei = 2 + (x*4)
drei = 3 + (x*4)
vier = 4 + (x*4)
sidename = allPasswords[eins]
username = allPasswords[zwei]
email = allPasswords[drei]
password = allPasswords[vier]
leerzeichen1 = 13 - len(sidename)
leerzeichen2 = 13 - len(username)
leerzeichen3 = 15 - len(email)
leerzeichen4 = 43 - len(password)
print(" " + sidename + leerzeichen1 + "|" + " " + username + leerzeichen2 + "|" + " " + email + leerzeichen3 + "|" + " " + password + leerzeichen4 + "|")
x += 1
# witchSite = input("For witch side do you want to know your password? ")
passwordsaver()
elif menuAnswer == "3":
newpassword = genpas()
print("Genarated password: " + newpassword)
passwordsaver()
elif menuAnswer == "Q":
print("Thanks for use this passwordmanager. See you!")
time.sleep(3)
# Quit
else:
print("Invalid Auswahl")
passwordsaver()
inputpass = input("Generalpassword: ")
if inputpass == generalpassword:
passwordsaver()
else:
print("Password incorrect")
Terminal:
Generalpassword:
-----------------Menu-----------------
1. Create new Password
2. Show Passwords
3. Generate only a Password
Q. Quit
--------------------------------------
2
Sidename | Username | E-Mail | Password |
--------------+--------------+------------------+--------------------------------------------+
Traceback (most recent call last):
File "C:\Users\lala\PycharmProjects\passwordmanager\main.py", line 82, in <module>
passwordsaver()
File "C:\Users\lala\PycharmProjects\passwordmanager\main.py", line 53, in passwordsaver
sidename = allPasswords[eins]
IndexError: list index out of range
Es wird immer ein Fehler angezeigt
allPasswords ist leer und du versuchst auf allPasswords[1] zuzugreifen.
Die Liste ist ohnehin obskur. Warum packst du sitename, username, password und email nicht in ein Tupel und steckst das als einen Eintrag in die Liste? Beim Hinzufügen machst du dann auch noch komische Dinge indem du alle Werte in einen String verkettest und den der Liste hinzufügst. Du hast also nicht mal 4 Einträge, sondern nur einen, den du auch nicht mehr sauber zerlegen kannst.
Zum eigentlichen Stil des Programms und der Namensvergabe sagt hoffentlich noch jemand anders etwas (ich muss gerade für 90 Minuten AFK).
Die Liste ist ohnehin obskur. Warum packst du sitename, username, password und email nicht in ein Tupel und steckst das als einen Eintrag in die Liste? Beim Hinzufügen machst du dann auch noch komische Dinge indem du alle Werte in einen String verkettest und den der Liste hinzufügst. Du hast also nicht mal 4 Einträge, sondern nur einen, den du auch nicht mehr sauber zerlegen kannst.
Zum eigentlichen Stil des Programms und der Namensvergabe sagt hoffentlich noch jemand anders etwas (ich muss gerade für 90 Minuten AFK).
Variablennamen schreibt man komplett klein, also all_passwords.
Benutze keine globalen Variablen!
Benutze keine Abkürzungen, wenn Du generate_password meinst, dann schreibe da auch so.
Rekursion ist kein Ersatz für Schleifen. `passwordsaver` sollte sich nicht selbst aufrufen.
`zwischenspeicher` wird definiert aber nicht benutzt.
`username` kann niemals leer sein, weil Du ein " / " anhängst.
Statt Strings mit + zusammenzustückeln würde man auch Stringformatierung benutzen.
Ein paar mehr Funktionen würden die Sache übersichtlicher machen.
Wenn man beim Beenden noch drei Sekunden warten muß, ist das ziemlich nervig.
Beim Anzeigen der Passwörter ist x ein schlechter Name für einen Index.
Eine for-Schleife wäre besser als eine while-Schleife.
Die Variablen eins, zwei, drei und vier sind eigentlich unnötig. Bei so unbedeutenden Rechnungen kann man sie auch gleich in die Eckigen Klammern einsetzen.
leerzeichen1..4 sind Zahlen, die kann man nicht mit Strings verbinden. Das ist auch sicher nicht das, was Du möchtest. Statt dessen benutzt man, wie schon oben geschrieben, Stringformatierung.
Zum eigentlichen Problem: Du packst ja die ganzen Informationen in einen String und nicht in vier aufeinanderfolgende Listeinträge. Damit greifst Du auch auf Elemente zu, die größer sind als die Länge der Liste. Wenn die Länge 3 wäre, dann läuft die Schleife mit x=0 los und greift auf den Index 1, 2, 3 und 4 zu, obwohl nur Indizes von 0 bis 2 vorhanden sind.
Besser wäre es natürlich, wie /me schon schrieb, statt Strings zusammenzustückeln, Tuple zu benutzen:
Benutze keine globalen Variablen!
Benutze keine Abkürzungen, wenn Du generate_password meinst, dann schreibe da auch so.
Rekursion ist kein Ersatz für Schleifen. `passwordsaver` sollte sich nicht selbst aufrufen.
`zwischenspeicher` wird definiert aber nicht benutzt.
`username` kann niemals leer sein, weil Du ein " / " anhängst.
Statt Strings mit + zusammenzustückeln würde man auch Stringformatierung benutzen.
Ein paar mehr Funktionen würden die Sache übersichtlicher machen.
Wenn man beim Beenden noch drei Sekunden warten muß, ist das ziemlich nervig.
Beim Anzeigen der Passwörter ist x ein schlechter Name für einen Index.
Eine for-Schleife wäre besser als eine while-Schleife.
Die Variablen eins, zwei, drei und vier sind eigentlich unnötig. Bei so unbedeutenden Rechnungen kann man sie auch gleich in die Eckigen Klammern einsetzen.
leerzeichen1..4 sind Zahlen, die kann man nicht mit Strings verbinden. Das ist auch sicher nicht das, was Du möchtest. Statt dessen benutzt man, wie schon oben geschrieben, Stringformatierung.
Code: Alles auswählen
import secrets
import string
LOS = string.digits + string.ascii_letters + string.punctuation
GENERAL_PASSWORD = ""
def generate_password():
return ''.join(secrets.choice(LOS) for _ in range(40))
def menu():
print("")
print("-----------------Menu-----------------")
print("1. Create new Password")
print("2. Show Passwords")
print("3. Generate only a Password")
print("Q. Quit")
print("--------------------------------------")
print("")
return input("")
def create_password():
site = input("Write the Sidename\n")
username = input("Write your Username\n")
if username == "":
username = "Username"
email = input("Write your E-mail\n")
password = generate_password()
return f"{site} / {username} / {email} / {password}"
def show_passwords(all_passwords):
print(" Sidename | Username | E-Mail | Password |")
print("--------------+--------------+------------------+--------------------------------------------+")
for row in range(0, len(all_passwords) + 1, 4):
sidename = all_passwords[row + 1]
username = all_passwords[row + 2]
email = all_passwords[row + 3]
password = all_passwords[row + 4]
print(f" {sidename:13s}| {username:13s}| {email:15s}| {password:43s}|")
def passwordsaver():
all_passwords = []
sidenames = []
while True:
menu_answer = menu()
if menu_answer == "1":
password = create_password()
all_passwords.append(password)
print("Site/username/e-mail/password")
print(all_passwords)
elif menu_answer == "2":
show_passwords(all_passwords)
elif menu_answer == "3":
new_password = generate_password()
print("Genarated password: " + new_password)
elif menuAnswer == "Q":
break
else:
print("Invalid Auswahl")
print("Thanks for use this passwordmanager. See you!")
def main():
input_password = input("Generalpassword: ")
if input_password == GENERAL_PASSWORD:
passwordsaver()
else:
print("Password incorrect")
if __name__ == "__main__":
main()
Besser wäre es natürlich, wie /me schon schrieb, statt Strings zusammenzustückeln, Tuple zu benutzen:
Code: Alles auswählen
def create_password():
site = input("Write the Sidename\n")
username = input("Write your Username\n")
if username == "":
username = "Username"
email = input("Write your E-mail\n")
password = generate_password()
return (site, username, email, password)
def show_passwords(all_passwords):
print(" Sidename | Username | E-Mail | Password |")
print("--------------+--------------+------------------+--------------------------------------------+")
for site, username, email, password in all_passwords:
print(f" {site:13s}| {username:13s}| {email:15s}| {password:43s}|")