String aus einer Eingabebox einlesen, verarbeiten und in anderer Box wieder ausgeben

Fragen zu Tkinter.
Antworten
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hallo,

ich habe ein Problem bei meinem "Verschlüsselungsprogramm" bin noch Neuling auf dem Gebiet Python und habe erst heute mit Tkinter angefangen.
Ich möchte, dass der Text der aus dem eingabefeldoben genommen wird, dann verarbeitet wird und bei eingabefeldunten ausgegeben wird, allerdings klappt das nicht und es kommt keine Fehlermeldung, wenn ich auf den Button klicke (egal auf welchen, bei beiden passiert nichts).
Ich hoffe mir kann einer da kurz helfen.

Mit freundlichen Grüßen / kind regards

Jankie :roll:


Code: Alles auswählen

from tkinter import *
from string import *
   
unversch = 'abcdefghijklmnopqrstuvwxyz0123456789!&%?()=.[]€'
versch = 'c97rdeu4!)wklh]1&%?(z5on0€ija=v3xyst62f.gbp[qm8'
	
	
def verschluesseln(nach, von):
	text = eingabefeldoben.get()
	trans = str.maketrans(nach, von)
	versch = str(text.lower().translate(trans))
	eingabefeldunten.delete(0, END)
	eingabefeldunten.insert(0, versch) 
   
   
   
master = Tk()

Label1 = Label(master, text="Was soll uebersetzt werden?:").grid(row=0, column=1)
Label2 = Label(master, text="Uebersetztes Wort:").grid(row=2, column=1)

eingabefeldoben = Entry(master)
eingabefeldunten = Entry(master)
eingabefeldoben.grid(row=1, column=1)
eingabefeldunten.grid(row=3, column=1)

buttonVersch = Button(master, text='Verschluesseln', command=verschluesseln(versch, unversch))
buttonEntsch = Button(master, text='Entschluesseln', command=verschluesseln(unversch, versch))
buttonVersch.grid(row=4, column=1)
buttonEntsch.grid(row=5, column=1)

mainloop()
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jankie: `command` muss eine Funktion oder Methode sein die kein Argument erwartet. Du übergibst da den Rückgabwert des `verschluesseln()`-Aufrufs den Du beim Erstellen der Schaltfläche schon aufrufst. Der Rückgabewert ist `None` und wenn man `None` als `command` übergibst, dann passiert nichts wenn man auf die Schaltfläche klickt.

Du müsstest Dir mal `functools.partial()` und/oder objektorientierte Programmierung (OOP) anschauen. Bei jeder nicht-trivialsen GUI kommt man ohne OOP sowieso nicht aus.

Sternchen-Importe sind Böse™. Du holst Dir da ca 130 Namen in das Modul von denen Du nur einen Bruchteil verwendest. Es wird schwerer nachvollziehbar wo welche Namen herkommen, und es besteht zudem die Gefahr von Namenskollisionen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Dann kann auch `verschluesseln()` nicht mehr so einfach ”magisch” auf Werte aus der Umgebung zugreifen. Denn Funktionen und Methoden sollten alles was sie ausser Konstanten benötigen als Argumente übergeben bekommen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jankie: Aus dem `string`-Modul wird alles per * importiert, aber nichts verwendet.

Bei den Namen sollte man sich an die Namenskonventionen halten: klein_mit_unterstrichen für alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Zudem sollten Namen nicht irgendwie kryptisch abgekürzt werden. Ein Name soll dem Leser vermitteln was der Wert bedeutet. Und kein Rätsel sein.

Der gleiche Name sollte im gleichen Kontext nicht für verschiedene Dinge verwendet werden.

Bei den Namen für die Eingabefelder sind ”oben” und ”unten” eher nicht die Eigenschaften die den Leser interessieren, sondern was da eingegeben wird.

Das Ergebnis von der `str.translate()`-Methode ist bereits eine Zeichenkette. Da noch einmal `str()` drauf anzuwenden macht keinen Sinn.

`Label1` und `Label2` werden an den Wert `None` gebunden und nirgendwo wieder verwendet.

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from functools import partial

UNVERSCHLUESSELT = 'abcdefghijklmnopqrstuvwxyz0123456789!&%?()=.[]€'
VERSCHLUESSELT = 'c97rdeu4!)wklh]1&%?(z5on0€ija=v3xyst62f.gbp[qm8'
assert set(VERSCHLUESSELT) == set(UNVERSCHLUESSELT)

    
def verschluesseln(input_entry, output_entry, table):
    output_entry.delete(0, tk.END)
    output_entry.insert(0, input_entry.get().lower().translate(table))
   
   
def main():
    master = tk.Tk()

    tk.Label(master, text='Was soll übersetzt werden?:').grid(row=0, column=1)
    tk.Label(master, text='Übersetztes Wort:').grid(row=2, column=1)

    input_entry = tk.Entry(master)
    output_entry = tk.Entry(master)
    input_entry.grid(row=1, column=1)
    output_entry.grid(row=3, column=1)

    crypt = partial(verschluesseln, input_entry, output_entry)
    
    tk.Button(
        master,
        text='Verschlüsseln',
        command=partial(crypt, str.maketrans(VERSCHLUESSELT, UNVERSCHLUESSELT)),
    ).grid(row=4, column=1)
    tk.Button(
        master,
        text='Entschlüsseln',
        command=partial(crypt, str.maketrans(UNVERSCHLUESSELT, VERSCHLUESSELT)),
    ).grid(row=5, column=1)

    master.mainloop()


if __name__ == '__main__':
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hallo blackjack,

vielen Dank für deine Antwort, habe meinen Code angepasst und jetzt funktioniert alles, super!

Wahrscheinlich war ich aber zu voreilig und werde mich noch mal mit der OOP auseinandersetzen, bevor ich weitere Sachen mit GUI versuche.
Antworten