Passwort Generator

Fragen zu Tkinter.
Antworten
CIMA-PYTHON
User
Beiträge: 4
Registriert: Donnerstag 30. Mai 2019, 12:14

Hallo,
Ich brauch Hilfe bei meinem Passwort Generator .Ich wollte eine GUI mit tkinter programmieren. Wenn ich die Länge angeben möchte und dies in range c mache dann gibt es eine Fehlermeldung.Wie kann ich das programmieren, dass wenn ich eine Zahl in die Eingabe eingebe ich dann diese länge erhalte.Würde mich über eine Antwort freuen , danke.

Mein Code:

Code: Alles auswählen

# GUI Version 1.0
from  tkinter import *
root = Tk()
import random

sLeft = "%s" % 750
sTop = "%s" % 250
sWidth = "%s" % 500
sHeight = "%s" % 500
root.wm_geometry(sWidth + "x" + sHeight + "+" + sLeft + "+" + sTop)
root.title("Passwort GUI")

chars = "abcdefghijklmnopqrstuvwxyz1234567890"

def generate():
    for p in range(1):
        password = ""
        for c in range(eingabe):
            password += random.choice(chars)
        lab1["text"] = password


eingabe = Entry(root, width=20)
eingabe.pack()

b1 = Button(root, text="Genrate", comman=generate)
b1.pack()

lab1 = Label(root, text="Passswort")
lab1.pack()

root.mainloop()
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum machst du einen range von 1 in generate? Der ist doch komplett wirkungslos. Und welche Fehlermeldung bekommst du genau? Und schau dir mal genau an, wie deine Argumente beim Button benamt sind, und wie die WIRKLICH heissen muesen. Und warum benennst du das Label so komisch "lab1"? Das sollte passwort_label oder etwas aehnliches heissen. Gleiches gilt fuer den Button. Und

sLeft = "%s" % 750

ist wirklich durch die Brust ins Auge. Entweder schreib gleich

sLeft = "750"

oder besser noch gleich format benutzen in deinem geometry call.

root.wm_geometry("{}x{}+{}+{}".format(...))
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@CIMA-PYTHON: Sternchen-Importe sind Böse™. Im Fall von `tkinter` holt man sich damit über 150 Namen ins Modul von denen nur ein kleiner Bruchteil benötigt wird. Schlimmer noch, auch mindestens einen Namen den man sich so gar nicht einfangen sollte, denn man bekommt ja nicht nur die Namen die das `tkinter`-Modul definiert, sondern auch was im `tkinter`-Modul von woanders importiert wird. Es wird damit schnell unübersichtlich wo welcher Name her kommt. Zudem besteht die Gefahr von Namenskollisionen.

`tkinter` wird üblicherweise unter dem Namen `tk` importiert: ``import tkinter as tk`` und dann über den namen auf die Werte in dem Modul zugegriffen, zum Beispiel ``password_label = tk.Label(…)``.

Was soll das `s` bei `sLeft`, `sTop`, und so weiter bedeuten? Namen sollten den Leser nicht zum Raten zwingen. Sollte das für `string` stehen – so eine Information hat weder ausgeschrieben noch abgekürzt etwas in Namen zu suchen.

Letztlich sollte man Grösse und Position für ein Fenster nicht vorgeben. Die Grösse ergibt sich bereits automatisch aus dem Fensterinhalt, und bei der Position weiss die Fensterverwaltung üblicherweise besser wo Platz ist, oder wo der Benutzer das gerne haben möchte, als der Programmierer.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Importe gehören an den Anfang des Moduls. Gefolgt von der Definition von Konstanten.

Für die ASCII-Kleinbuchstaben und Ziffern gibt es im `string`-Modul bereits Konstanten, die muss man nicht selbst eintippen.

Auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Funktionen und Methoden sollten alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen. Das bedeutet bei GUIs in der Regel das man objektorientierte Programmierung (OOP) benötigt. In sehr einfachen Fällen geht es meistens noch mit `functools.partial()`, aber OOP sollte man eigentlich drauf haben, bevor man mit der GUI-Programmierung anfängt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
CIMA-PYTHON
User
Beiträge: 4
Registriert: Donnerstag 30. Mai 2019, 12:14

Ich bin jetzt mit der GUI so weit,dass ich die Länge angeben kann. Doch ich kann das generierte Passwort im Label nicht markieren oder auswählen (um es zu kopieren). Ich habe auch versucht das Passwort in ein Eingabefenster einzufügen doch das hat nicht funktioniert.Freue mich sehr über Hilfe oder Verbesserungen am Code :D (Python 3.7.3 Anfänger)

Code: Alles auswählen

from  tkinter import *
root = Tk()
import random
chars = "abcdefghijklmnopqrstuvwxyz1234567890"
def generate():
    password=""
    eingabeWert = int(eingabe.get())
    if eingabeWert < 2:
        eingabeWert = 2
    for c in range(eingabeWert):
         password+=random.choice(chars)
         passwortlabel["text"] = passwordfile:///home/u-dack/Bildschirmfoto%20von%202019-06-06%2021-50-54.jpg

eingabe = Entry(root, width=20)
eingabe.pack()
eingabe.insert(0, "8")
generiere = Button(root, text="Genrate", comman=generate)
generiere.pack()
passwortlabel = Label(root, text="Passswort")
passwortlabel.pack()
root.mainloop()
Senol
User
Beiträge: 7
Registriert: Freitag 20. September 2019, 11:04

Hi, wollte mal fragen was dieser Part hier bedeutet.

passwortlabel["text"] = passwordfile:///home/u-dack/Bildschirmfoto%20von%202019-06-06%2021-50-54.jpg

^^
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Der bedeutet das da etwas in die Datei gekommen ist das da nicht hingehört.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Könnte so aussehen:

Code: Alles auswählen

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

CHARS = string.ascii_lowercase + string.digits

def generate(eingabe, password_str):
    laenge = int(eingabe.get())
    if laenge < 2:
        laenge = 2
    password = ''.join(random.choices(CHARS, k=laenge))
    password_str.set(password)

def main():
    root = tk.Tk()
    eingabe = tk.Entry(root, width=20)
    eingabe.insert(0, "8")
    eingabe.pack()
    passwort_str = tk.StringVar()
    tk.Button(root, text="Erzeugen", command=partial(generate, eingabe, passwort_str)).pack()
    tk.Entry(root, textvariable=passwort_str).pack()
    root.mainloop()

if __name__ == '__main__':
    main()
Senol
User
Beiträge: 7
Registriert: Freitag 20. September 2019, 11:04

Super danke ^^
Antworten