PySimpleGUI: Funktion via Button ausgeben

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
mohammed.chang
User
Beiträge: 2
Registriert: Mittwoch 9. Dezember 2020, 13:52

Hallo! :) Ich bin noch sehr frisch in Python unterwegs. Klassisches Einstiegsprojekt ist ein Passwort-Generator, der mir zehn Passwörter zur Verfügung stellen soll. Dazu habe ich eine entsprechende Funktion in einer eigenen .py-Datei:

Code: Alles auswählen

import string as s
import secrets

def generate_password(length: int, symbols: bool, uppercase: bool):
    combination = s.ascii_lowercase + s.digits

    if symbols:
        combination += s.punctuation

    if uppercase:
        combination += s.ascii_uppercase
    combination_length = len(combination)

    new_password = ""

    for _ in range(length):
        new_password += combination[secrets.randbelow(combination_length)]
    return new_password

for _, index in enumerate(range(10)):
    password = generate_password(length=80, symbols=True, uppercase=True)

    print(index + 1, ":", password)

Diesen Code möchte ich nun mit PySimpleGUI via Button "Generate" in ein Textfeld ausgeben lassen. Ich habe dazu eine weitere .py-Datei mit folgendem Code:

Code: Alles auswählen

import PySimpleGUI as sg

sg.theme("Dark Blue")

layout = [
    [sg.Text("Generate passwords.")],
    [sg.Button("Generate")],
    [sg.Multiline(size=(90, 10))]
]

window = sg.Window("Passwort Generator", layout)

while True:
    event, values = window.read()

    if event == sg.WIN_CLOSED:
        break

    if event == "Generate":
        print("Passwort generiert")

window.close()
Das Event für den "Generate"-Button soll natürlich nicht mehr

Code: Alles auswählen

print("Passwort generiert")
sein und erst recht nicht mehr in die Konsole ausgeben, sondern die Ausgabe der zehn Passwörter in dem Multiline-Feld vornehmen.

Aber ich finde da noch keinen Weg hinein. Habt Ihr einen Tipp, wie ich die Funktion "generate_password" über das Multiline-Feld ausgeben kann?

Vielen Dank vorab!
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mohammed.chang: Der Code sollte nicht auf Modulebene stehen sondern entweder in einer Funktion die 10 Passwörter zum Beispiel in einer Liste an den Aufrufer zurück gibt, statt sie auszugeben, oder Du musst halt in der GUI die `generate_password()`-Funktion 10× aufrufen.

``for _, index in enumerate(range(10)):`` ist ein bisschen sinnlos. Was soll das denn bringen mit `enumerate()` noch mal die gleichen Werte zu generieren, die auch das `range()` schon liefert, und die dann einfach zu ignorieren‽

`secrects` wird importiert, aber nirgends verwendet und `string` sollte man nicht einfach mit einem `s` abkürzen. Einbuchstabige Namen, oder generell kryptische Abkürzungen sind keine gute Idee. Bei GUI-Rahmenwerken oder anderen Modulen in denen *sehr* viele Namen sind, die man verwendet, ist es üblich das Modul abzukürzen um nicht alles importieren zu müssen, aber auch nicht allzuoft den Modulnamen ausschreiben zu müssen. Aber das beschränkt sich auf bestimmte Module bei denen das üblich ist. Das sollte man nicht allgemein so machen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
mohammed.chang
User
Beiträge: 2
Registriert: Mittwoch 9. Dezember 2020, 13:52

__blackjack__ hat geschrieben: Dienstag 29. November 2022, 16:28 ``for _, index in enumerate(range(10)):`` ist ein bisschen sinnlos. Was soll das denn bringen mit `enumerate()` noch mal die gleichen Werte zu generieren, die auch das `range()` schon liefert, und die dann einfach zu ignorieren‽
Damit hole ich mir zunächst 10 Ergebnisse (fest programmiert, nicht nutzerseitig via "input" veränderbar) und lasse die direkt nummeriert ausgeben. Die Ausgabe in der Konsole ist dann bspw. wie folgt:

1 : )9tm%\/,&xMYb_#5\IVwr{U$OWIe<]?l}3&:mVx&*OVUdx;/k4lr#SOR=4`)$cZ~C9H*[,>BHun!-$af
2 : hgB!ir(0|KXF*0OD$?\WGtzWK=[Y6@d>K=ErtZOd[dzF&D-?3x3B:I1+`'|=D;@$F+x_:Pu/;vXaZ#J#
3 : BAcI8Su?`ws"5+=@SZgqBwZR.;&38hX*0rtE<X?EX%txK/&RBw_LFGAjlO!jzO]<BjkT.^s?j1\j93sn
4 : RF+gaOG3i3*.BP4N\q>w<!qRBJSratt;CE!Pd[R]&e;|#L~|>2o2c"%LXa8u54EXCY2&(|J9AZ,6/fsu
5 : _$po7TCJ!P3J$*|VJuSzWNy~6[QK0:znE7(mYY%nH>ns;j[~7d,$lW+B9<PfG1XG'v-xpa_u+cCjxN1)
6 : 9$E-*,DUwzpbE'P}:{OFhG-/5(oe|"}PXsPl/T26pB$;gWot,6)[(bFG{^}Ac}WMe-8opT{Nq+Yr.kjk
7 : T:G|H>]:r\J2xk56|=}o$9^4|_8ChVtsQFmNeWL~$B818<ZM{3bI4Y~f-_Z<*h|p!!/g$4/=xM"4v{7I
8 : GbJ+t(aRCJdy*Q@_`Y8FL|j`Xl2c?qk<lG>buVz@|;%&cc~[hy;>3b#NV'.{ueZcKubzQX>pY;88h)We
9 : 0v>;;'xedK#!(x4?Pz#nsv{rP[c_XX~[7cZf8"viO*4R^tpk%_$&`wvo}K^b!PM;R4.%=D*/3ksOF2HF
10 : "-f;P~S\,'LW*n_3}kZj-h/saprp7yc(s<u$,mjYPsTks7,\Y,@1o1@T4:eItz)W9qu(dFY%iC]!^{8D
__blackjack__ hat geschrieben: Dienstag 29. November 2022, 16:28 `secrects` wird importiert, aber nirgends verwendet
Secrets verwende ich für "new_password".
__blackjack__ hat geschrieben: Dienstag 29. November 2022, 16:28 und `string` sollte man nicht einfach mit einem `s` abkürzen. Einbuchstabige Namen, oder generell kryptische Abkürzungen sind keine gute Idee. Bei GUI-Rahmenwerken oder anderen Modulen in denen *sehr* viele Namen sind, die man verwendet, ist es üblich das Modul abzukürzen um nicht alles importieren zu müssen, aber auch nicht allzuoft den Modulnamen ausschreiben zu müssen. Aber das beschränkt sich auf bestimmte Module bei denen das üblich ist. Das sollte man nicht allgemein so machen.
Ich hab die Abkürzung entfernt und nutze nun die normale Schreibweise. Danke für den Hinweis.
__blackjack__ hat geschrieben: Dienstag 29. November 2022, 16:28 Der Code sollte nicht auf Modulebene stehen sondern entweder in einer Funktion die 10 Passwörter zum Beispiel in einer Liste an den Aufrufer zurück gibt, statt sie auszugeben, oder Du musst halt in der GUI die `generate_password()`-Funktion 10× aufrufen.
Okay, das mit der Liste wirkt erstmal nicht unlogisch. Sie wäre dann quasi sowas wie ein Container, dessen Inhalt für die spätere Ausgabe im GUI dann abgerufen wird?
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mohammed.chang: Mir ist schon klar was die Schleife macht, nur nicht warum da die ganzen Zahlen mit `enumerate()` mit den *gleichen* ganzen Zahlen aufgezählt werden, nur um die aufgezählte Zahl dann überhaupt nicht zu benutzen sondern nur die Zahl(en) die `range()` liefert. Das macht überhaupt keinen Sinn das so zu machen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

secrects kennt wie random choice:

Code: Alles auswählen

def generate_password(length symbols, uppercase):
    combination = string.ascii_lowercase + string.digits
    if symbols: 
        combination += string.punctuation
    if uppercase:
        combination += string.ascii_uppercase
    return "".join(secrets.choice(combination) for _ in range(length))
Antworten