Playfair mit GUI

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
Beispielname
User
Beiträge: 2
Registriert: Freitag 11. Januar 2008, 14:52
Wohnort: b Neubrandenburg

Hallo,

Ich habe ein Playfair-Verschlüsselungsprogramm geschrieben mit GUI und an sich funktioniert es auch, außer ein Problem, in meinem

Hauptprogramm:

Code: Alles auswählen

# -*- coding: cp1252 -*-
class Playfair:

    def __init__(self, klartext, keytext):
        self.klartext = klartext
        self.keytext = keytext
        codiertext = ''
        codieralphabet = ''
        self.globall = ''

    def textformatieren(self):
        a = str(self.klartext)
        a = self.klartext.upper()
        text = ''
        for i in range(len(a)):
            if a[i] == 'Ä':
                text = text + 'AE'
            elif a[i] == 'Ö':
                text = text + 'OE'
            elif a[i] == 'Ü':
                text = text + 'UE'
            elif a[i] == 'ß':
                text = text + 'SZ'
            elif a[i] == '"':
                text = text + ''
            elif a[i] == "'":
                text = text + ''
            elif a[i] == ".":
                text = text + ''
            elif a[i] == " ":
                text = text + ''
            elif a[i] == "J":
                text = text + 'I'
            else:
                text = text +  a[i]
        text2=''
        for e in range(len(text)-1):
            if text[e] == text[e+1]:
                text2 = text2 + text[e] + "X" #bei doppelten Zeichen nur erstes beachten
            else:
                text2 = text2 + text[e]
        text2 = text2 + text[len(text)-1]
        if len(text2) % 2 == 1:
            text2 =text2 + "X"
        self.codiertext = text2
        print text2

    def alphabetisieren(self):
        b = str(self.keytext)
        b = self.keytext.upper()
        text = ''
        keytextalphabet = 'ABCDEFGHIKLMNOPQRSTUVWXYZ'
        #erweitert mit der Begruendung s.u.
        b += keytextalphabet
        for i in range(len(b)):
            if b[i] == 'Ä':
                text = text + 'AE'
            elif b[i] == 'Ö':
                text = text + 'OE'
            elif b[i] == 'Ü':
                text = text + 'UE'
            elif b[i] == 'ß':
                text = text + 'SZ'
            elif b[i] == '"':
                text = text + ''
            elif b[i] == "'":
                text = text + ''
            elif b[i] == ".":
                text = text + ''
            elif b[i] == " ":
                text = text + ''
            elif b[i] == "J":
                text = text + 'I'
            else:
                text = text +  b[i]
        text3 = ''
        keytextneu = ''
        for e in range(len(text)):
            if text3.find(text[e]) == -1:
                text3 = text3 + text[e]
        self.codieralphabet = text3
        print text3
    
    def codieren(self):
        #codiertext = self.textformatieren.text2
        ausgabetext=''
        final=''
        while len(self.codiertext) <> 0:
            erstebeide = self.codiertext[0:2]
            pos1 = self.codieralphabet.find(erstebeide[0])
            pos2 = self.codieralphabet.find(erstebeide[1])
            self.codiertext = self.codiertext[2:]
            y1 = pos1 / 5
            x1 = pos1 % 5
            y2 = pos2 / 5
            x2 = pos2 % 5
            if y1 == y2:
                if x1 == 4:
                    x1 = 0
                else: x1 += 1
                if x2 == 4:
                    x2 = 0
                else: x2 += 1
                z1 = y1 * 5 + x1
                z2 = y2 * 5 + x2
            else:
                if x1 == x2:
                    if y1 == 4:
                        y1 = 0
                    else: y1 += 1
                    if y2 == 4:
                        y2 = 0                
                    else: y2 += 1
                    z1 = y1 * 5 + x1
                    z2 = y2 * 5 + x2
                else:
                    z1 = 5 * y1 + x2
                    z2 = 5 * y2 + x1
            ausgabetext = ausgabetext + self.codieralphabet[z1]+self.codieralphabet[z2]
            self.globall = ausgabetext
        return "global:" + self.globall
            
da wird die letzte ausgabe (return gloabll) nicht in der GUI richtig ausgegeben, hier die GUI:

Code: Alles auswählen


# -*- coding: utf-8 -*-
from Tkinter import *
from playfair_beforereachinggold import *

class Playfair_GUI(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        self.master.title("Playfair")
        self.place(x=0, y=0)
        self.config(width=900, height=330)
        self.createWidgets()

    def createWidgets(self):
        self.clearword = Label(self, text = "Bitte zu verschlüsselndes Wort eingeben:")
        self.clearword.place(x=50, y = 10)
        self.clearword = Label(self, text = "Bitte Schlüsselwort eingeben:")
        self.clearword.place(x=320, y = 10)
        self.eingabe1 = Text(self)
        self.eingabe1.config(width=30, height=15)
        self.eingabe1.insert('0.0','Oh schaurig ist')
        self.eingabe1.place(x=50, y=30)
        self.eingabe2 = Text(self)
        self.eingabe2.config(width=30, height=15)
        self.eingabe2.insert('0.0','derknabeimmoor')
        self.eingabe2.place(x=320, y=30)
        self.bStart = Button(self,text="Codieren/Decodieren")
        self.bStart.bind("<Button-1>", self.starten)
        self.bStart.place(x=220, y = 235)
        self.label = Label(self, text = "Verschlüsselter Text")
        self.label.config(bg = "lightgray")
        self.label.place(x=550, y=10)
        self.ausgabe = Text(self)
        self.ausgabe.config(width=30, height=15)
        self.ausgabe.place(x=550, y=30)

    def starten(self, event):
        self.playfair = Playfair(self.eingabe1.get('1.0',END),self.eingabe2.get('1.0',END))
        self.playfair.textformatieren()
        self.playfair.alphabetisieren()
        self.playfair.codieren()
        textneu = self.playfair.globall
        self.label.config(text = textneu)
        self.ausgabe.insert('0.0',textneu)
        
def main():
    root = Tk()
    root.config(width = 900, height = 330)
    gui = Playfair_GUI(root)
    root.mainloop()

main()


was muss ich ändern , die richtige ausgabe aus dem klartext wäre: ML PG CM SN GS GX UT ist aber in der gui-ausgabe: HTPGOWDMFMQLH .

danke im voraus für hilfe!

mfg Paul[/code]
Python-Quereinsteiger
BlackJack

Du müsstest den Fehler in der Berechnung finden und beheben.

Ansonsten gäbs noch ein paar Bemerkungen zum Programm. Warum ist `Playfair` eine Klasse? Das scheint unnötig komplex zu sein, ein paar Funktionen hätten es auch getan.

Die beiden vorletzten Zeilen in `Playfair.__init__()` haben keinen Effekt, können also entfernt werden. Und was ist `self.globall` für ein Name!? Der sagt nichts darüber aus, was das Objekt daran gebundene Objekt für eine Bedeutung hat.

`textformatieren()` und `alphabetisieren()` enthalten ein gutes Stück identischen Quelltext, den man in eine eigene Funktion auslagern kann. Und eventuell etwas eleganter und performanter schreiben könnte. ``for i in range(len(obj))`` sollte man so gut wie immer durch das direkte iterieren über `obj` ersetzen. Und den neuen Text auf diese Weise zusammen zu setzen ist ungünstig weil bei jedem ``text = text + irgendwas`` immer eine neue Zeichenkette erzeugt wird in die die beiden "Summanden" hinein kopiert werden. Das ist nicht so ideal. In der Regel ist es besser die Teilzeichenketten in einer Liste zu sammeln und am Ende mit der `join()`-Methode auf einer leeren Zeichenkette zusammen zu setzen.

Bei der zweiten Schleife in `textformatieren()` könnte man dann auch über diese Liste gehen und dort einfach einzelne Zeichen durch 'X'e austauschen, statt alles noch einmal zu kopieren.

In `codieren()` könnte man eine ``for``-Schleife schreiben die einen Index in Zweierschritten erzeugt, mit dem man die Buchstabenpaare aus dem `codiertext` per Slice-Notation holen kann, dann muss man den verbleibenden `codiertext` nicht für jedes Buchstabenpaar kopieren.

Für die Berechnung von `y1`, `x1`, `y2`, und `x2` schau Dir mal die `divmod()`-Funktion an.

Zum Hauptprogramm: Sternchenimports sollte man vermeiden.

Widgets sollten sich in der `__init__()` nicht selbst "layouten", `pack()` oder `grid()` sollte man immer von aussen aufrufen, sonst nimmt man dem Widget Flexibilität. Und `place()` sollte man gar nicht verwenden. Die Koordinaten passen vielleicht auf Deinem Rechner, mit Deiner Bildschirmauflösung, Deinen Schriftarten, und Deiner Schriftgrösse. Bei anderen sieht's dann nicht mehr so gut aus und es entsteht viel Leerraum, oder schlimmer die Elemente überlappen sich und werden unbenutzbar. Layoutmanager nehmen einem diese Probleme ab und sorgen dafür, das alles an der richtigen Stelle und in der richtigen Grösse dargestellt wird.

In der GUI gibt's ja fast nichts was nicht an das GUI-Objekt gebunden wird, obwohl kaum etwas davon auf diesem Objekt benötigt wird.

Die Aktionen von `Button`\s bindet man über das `command`-Argument an den Button. Wenn man die Maustaste selbst bindet, verhalten sich Buttons nicht so wie man das gewohnt ist.

Die `Playfair.codieren()`-Methode hat einen Rückgabewert, den Du nicht bindest, statt dessen gibt's das "hässliche" `globall`.

Und warum wird das Ergebnis sowohl in das Label über der Ergebnistextbox *und* in dieselbe geschrieben? Das sollte doch eigentlich nur in der Textbox landen, oder!?
Beispielname
User
Beiträge: 2
Registriert: Freitag 11. Januar 2008, 14:52
Wohnort: b Neubrandenburg

also erstmal vielen dank, dass du versuchen willst das programm zu optimieren, aber das war ja gar nicht meine frage. ich habe mittlerweile selbst heraus bekommen worin mein fehler lag, dass globall nicht richtig in die textbox eingetragen wird, die abfrage der zeichen musste wie folgt erfolgen:

Code: Alles auswählen

    def starten(self, event):
        #Paul, lies in dr Doku nach, bis wohin ausgelesen werden muss
        self.playfair = Playfair(self.eingabe1.get("1.0","1.end"),self.eingabe2.get("1.0","1.end"))
        self.playfair.textformatieren()
        self.playfair.alphabetisieren()
        print self.playfair.codieren()
        #textneu = self.playfair.globall
        #self.label.config(text = self.playfair.globall)
        self.ausgabe.insert(END,self.playfair.globall)

und das wegen dem label da oben war ja erstmal nur probehalber weise, das ist jetzt anders, das programm war ja noch nicht in diesem sinne "fertig" ... danke aber für deine hilfe, aber sie war etwas zu ausführlich ... ich hab versucht einige tipps umzusetzen, aber so sehr kenn ich mich mit python auch noch nicht aus...

mfg
Python-Quereinsteiger
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Beispielname hat geschrieben:also erstmal vielen dank, dass du versuchen willst das programm zu optimieren
Er versucht nicht, das Programm zu optimieren, er versucht dich zu retten, bevor du in einem See von code ertrinkst, und niemand dir mehr helfen kann, weil niemand den code versteht.
Jede gelöschte Zeile ist eine bugfreie Zeile, und so.
Ausserdem...
so sehr kenn ich mich mit python auch noch nicht aus
...kann es sein, dass du aus der Java/C#-ecke kommst? Dann sind die Tipps, die auf die Unnötigkeit von Klassen hinweisen besonders gut, denn in Python sind Klassen um der Klassen willen eine schlechte Idee, und man muss es sich bewusst abgewöhnen.
Antworten