Wo sind die Fehler?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Haijaguar
User
Beiträge: 2
Registriert: Donnerstag 11. November 2021, 08:10

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()
Sirius3
User
Beiträge: 18278
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Haijaguar
User
Beiträge: 2
Registriert: Donnerstag 11. November 2021, 08:10

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht den Post davor voll zitieren. Der steht da schon. Und Sirius3 hat gefragt, was nicht geht. Die Angabe fehlt.
Sirius3
User
Beiträge: 18278
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
Benutzeravatar
noisefloor
User
Beiträge: 4195
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
__blackjack__
User
Beiträge: 14077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten