Seite 1 von 1

Wo sind die Fehler?

Verfasst: Donnerstag 11. November 2021, 08:22
von Haijaguar
Hey habe denauftrag einen Password generator zu mahen einen sehr einfachen hab ich schon und wollte mich an einen komplizierteren ran wagen kann mir jm helfen meinen Fehler oder meine fehler zu finden?

Code: Alles auswählen

from tkinter import *
import tkinter as tk
import random

root = tk.Tk()

validation = (root.register(str.isdigit), '%S')
tk.Label(root, text='Länge des Passwortes').pack()
entry = tk.Entry(root, validate="key", validatecommand=validation)
entry.pack()


var1 = tk.IntVar()
var2 = tk.IntVar()
var3 = tk.IntVar()
var4 = tk.IntVar()
var5 = tk.IntVar()
var6 = tk.IntVar()

checkbox01 = tk.Checkbutton(root, text="Großbuchstaben", onvalue=1, offvalue=0)
checkbox01.pack()


checkbox02 = tk.Checkbutton(root, text="Kleinbuchstaben", onvalue=1, offvalue=0)
checkbox02.pack()


checkbox03 = tk.Checkbutton(root, text="Zahlen", onvalue=1, offvalue=0)
checkbox03.pack()


checkbox04 = tk.Checkbutton(root, text="Sonderzeichen", onvalue=1, offvalue=0)
checkbox04.pack()


checkbox05 = tk.Checkbutton(root, text="BesondereGroßbuchstaben", onvalue=1, offvalue=0)
checkbox05.pack()


checkbox06 = tk.Checkbutton(root, text="BesondereKleinbuchstaben", onvalue=1, offvalue=0)
checkbox06.pack()


Button1 = tk.Button(root, text="Aktion durchführen", command=passgen)
Button1.pack()
Button2 = tk.Button(root, text="Neues Password", command=newpw)
Button2.pack()

BL = ["Q", "W", "E", "R", "T", "Z", "U", "I", "O", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Y", "X", "C", "V", "B", "N", "M"]
sL = ["q", "w", "e", "r", "r", "z", "u", "i", "o", "p", "a", "s", "d", "f", "g", "h", "j", "k", "l", "y", "x", "c", "v", "b", "n", "M", "ß"]
Za = ["1","2","3","4","5","6","7","8","9","0"]
SZa = [".", ":", ",", ";", "#", "+", "*", "~", "-", "_", "!", "@", "§", "$", "%", "&", "/", "?", "€", "|"]
BLS = ["Ä", "Ü", "Ö"]
sLS = ["ü", "ä", "ö"]

PwO = []

length = entry.get()
pw = random.sample(PwO,length)
password = "".join(pw)
print(password)

def passgen():
    if (var1.get()  == 1) or (checkbox01.get() == 1):
         PwO.extend(BL)
         print("hey")
    if (var2.get()  == 1) or (checkbox02.get() == 1):
        PwO.extend(sL)
        print("how")
    if (var3.get()  == 1) or (checkbox03.get() == 1):
        PwO.extend(Za)
        print("are")
    if (var4.get()  == 1) or (checkbox04.get() == 1):
        PwO.extend(SZa)
        print("you")
    if (var5.get()  == 1) or (checkbox05.get() == 1):
        PwO.extend(BLS)
        print("little")
    if (var6.get()  == 1) or (checkbox06.get() == 1):
        PwO.extend(sLS)
        print("fella")

def newpw():
    del PwO[:]
    entry.delete()

root.mainloop()

Re: Wo sind die Fehler?

Verfasst: Donnerstag 11. November 2021, 09:26
von Sirius3
Eine etwas genauere Beschreibung, was Dein Programm macht und wie es von Deiner Erwartung abweicht, wäre hilfreich. So kann ich nur schreiben, was alles nicht in Ordnung ist, aber nicht genau auf Dein Problem eingehen.

Sternchenimporte sind böse, weil sie unkontrolliert viele Namen einbinden, die gar nicht gebraucht werden und im Zweifel andere überschreiben, ohne dass man es merkt. Soweit ich sehe, benutzt Du auch nichts vom tkinter-*-Import.
Aller Code muß in Funktionen stehen, es darf keine globalen Variablen geben. Daraus folgt auch, dass alles was eine Funktion braucht, über ihre Argumente übergeben werden muß.
Benutze sprechende Variablennamen, also nicht nur durchnummeriert oder mit kryptischen Abkürzungen. Alle ASCII-Großbuchstaben, -Kleinbuchstaben oder Zahlen gibt es im strings-Modul schon als Konstanten. Konstanten werden auch KOMPLETT_GROSS geschrieben, während alle Variablen komplett klein geschrieben werden.
var1 bis 6 werden nirgends benutzt, werden also in Deinen if-Abfragen nie einen anderen Wert als 0 liefern.
Die Klammern bei den if-Bedingungen sind überflüssig.

Re: Wo sind die Fehler?

Verfasst: Donnerstag 11. November 2021, 09:39
von Haijaguar
Sirius3 hat geschrieben: Donnerstag 11. November 2021, 09:26 Eine etwas genauere Beschreibung, was Dein Programm macht und wie es von Deiner Erwartung abweicht, wäre hilfreich. So kann ich nur schreiben, was alles nicht in Ordnung ist, aber nicht genau auf Dein Problem eingehen.

Sternchenimporte sind böse, weil sie unkontrolliert viele Namen einbinden, die gar nicht gebraucht werden und im Zweifel andere überschreiben, ohne dass man es merkt. Soweit ich sehe, benutzt Du auch nichts vom tkinter-*-Import.
Aller Code muß in Funktionen stehen, es darf keine globalen Variablen geben. Daraus folgt auch, dass alles was eine Funktion braucht, über ihre Argumente übergeben werden muß.
Benutze sprechende Variablennamen, also nicht nur durchnummeriert oder mit kryptischen Abkürzungen. Alle ASCII-Großbuchstaben, -Kleinbuchstaben oder Zahlen gibt es im strings-Modul schon als Konstanten. Konstanten werden auch KOMPLETT_GROSS geschrieben, während alle Variablen komplett klein geschrieben werden.
var1 bis 6 werden nirgends benutzt, werden also in Deinen if-Abfragen nie einen anderen Wert als 0 liefern.
Die Klammern bei den if-Bedingungen sind überflüssig.
Das Program soll ein Password generator sein in dem ich länge selbs bestimme kann genauso wie was alles enthalten sein soll, sprich Groß-,Kleinbuschstaben, Sonderzeichen, besondere Kleinbuchstaben oder besondere Großbuchstaben später will ich noch hinzufügen das einige wörter enthalten sein können die ma will und evllt einen Passwordmanager

Die betimmung was allesenthalten sein soll soll über Checkboxen laufen und die länge soll man selbst eingeben können

Re: Wo sind die Fehler?

Verfasst: Donnerstag 11. November 2021, 09:58
von __deets__
Bitte nicht den Post davor voll zitieren. Der steht da schon. Und Sirius3 hat gefragt, was nicht geht. Die Angabe fehlt.

Re: Wo sind die Fehler?

Verfasst: Donnerstag 11. November 2021, 09:59
von Sirius3
Du erzeugst ja mitten im Code Dein Passwort und gibst es per `print` aus, ohne dass Dein Fenster überhaupt erst sichtbar ist.
Es schwächt auch die Passwörter ungemein, dass Zeichen nicht doppelt vorkommen.

Dsa ganze könnte so aussehen:

Code: Alles auswählen

import tkinter as tk
from functools import partial
import random
import string

ZEICHEN_GRUPPEN = {
    "Großbuchstaben": string.ascii_uppercase,
    "Kleinbuchstaben": string.ascii_lowercase,
    "Zahlen": string.digits,
    "Sonderzeichen": ".:,;#+*~-_!@§$%&/?€|",
    "BesondereGroßbuchstaben": "ÄÖÜ",
    "BesondereKleinbuchstaben": "äöü",
}

def generate_password(password_length_entry, zeichengruppen_auswahl, generated_password):
    zeichen = []
    for auswahl in zeichengruppen_auswahl:
        zeichen.extend(auswahl.get())
    length = int(password_length_entry.get())
    generated_password['text'] = "".join(random.sample(zeichen, length))

def main():
    root = tk.Tk()
    tk.Label(root, text='Länge des Passwortes').pack()
    password_length_entry = tk.Entry(root)
    password_length_entry.pack()
    zeichengruppen_auswahl = []
    for name, zeichen in ZEICHEN_GRUPPEN.items():
        auswahl = tk.StringVar(root)
        tk.Checkbutton(root, text=name, variable=auswahl, onvalue=zeichen, offvalue="").pack()
        zeichengruppen_auswahl.append(auswahl)
    generated_password = tk.Label(root)
    generated_password.pack()
    tk.Button(root, text="Aktion durchführen", command=partial(generate_password, password_length_entry, zeichengruppen_auswahl, generated_password)).pack()
    root.mainloop()

if __name__ == "__main__":
    main()

Re: Wo sind die Fehler?

Verfasst: Donnerstag 11. November 2021, 10:41
von noisefloor
Hallo,

allgemeiner Tipp: es ist in der Regel sinnvoll, das Passwort nur aus Zeichen zusammenzusetzen, die auf jeder Tastatur (sprich jedem Tastaturlayout) vorkommen. Sprich z.B. keine öäü߀ einbauen, weil man die Zeichen auf einer Tastatur mit englischem Layout (also QWERTY) gar nicht ohne weiteres eingeben kann.

Gruß, noisefloor

Re: Wo sind die Fehler?

Verfasst: Donnerstag 11. November 2021, 11:17
von __blackjack__
Es kann auch sinnvoll sein bestimmte Zeichen auszunehmen die sich sehr ähnlich sehen, 1 und l oder 0 und O beispielsweise.

Dann bieten manche Passwortgeneratoren auch die Option ”aussprechbare” Passwörter zu generieren. Also wo entsprechend Vokale und Konsonanten in einer Folge gewählt werden, die einem keinen Knoten in die Zunge machen würden, wenn man das ausspricht. Manche Leute können sich solche Worte dann besser merken ohne sie irgendwo aufschreiben zu müssen.