Kleine Hilfe zu erstem GUI

Fragen zu Tkinter.
Muh-Kuh
User
Beiträge: 9
Registriert: Montag 22. Februar 2010, 21:30

Hallo, liebe Community!
Ich bin hier ganz frisch, sowohl im Forum als auch in der Programmiersprache, aber da ich sehe das hier viele nette Leute sind, hoffe ich auf Hilfe :)

Da ich seit ein paar Wochen im Informatik-Unterricht mit Python angefangen habe und wir langsam, aber sicher weiterkommen, brauche ich mal ein bisschen Hilfe.

Wir haben die letzten Wochen uns mit dem "Programmieren" von Ver- und Entschlüsselungsprogrammen beschäftigt. Das klaptt eigentlich auch schon ganz gut. Hier mein dazu fähiges Programm:

Code: Alles auswählen

def verschluesselung(klartext,schluesseltext):
    geheimtext=''
    n=len(klartext)
    k=len(schluesseltext)
    while k<n:
        schluesseltext=schluesseltext+schluesseltext
        k=len(schluesseltext)
    for z in range(n):
        code1=ord(klartext[z])-96
        code2=ord(schluesseltext[z])-96
        code3=code1+code2
        if code3>26:
            code3=code3-26
        zeichen=chr(code3+96)
        geheimtext=geheimtext+zeichen
    print geheimtext


def entschluesselung(geheimtext,schluesseltext):
    klartext=''
    n=len(geheimtext)
    k=len(schluesseltext)
    while k<n:
        schluesseltext=schluesseltext+schluesseltext
        k=len(schluesseltext)
    for z in range(n):
        code1=ord(geheimtext[z])-96
        code2=ord(schluesseltext[z])-96
        code3=code1-code2
        if code3<1:
            code3=code3+26
        code3=code3+96
        zeichen=chr(code3)
        klartext=klartext+zeichen
    print klartext
Das soll auch erstmal so bleiben, weil wir noch nix weiter gemacht haben, um es vielleicht noch weiter auszubauen.

Unser jetziges Thema ist die graphische Oberfläche, als ein GUI :)

Wir hatten erst ein ganz einfaches Beispiel gekriegt, nämlich eine Oberfläche (also schon vorprogrammiert gekriegt), auf der man oben seinen Namen eingibt, dann über einen Radiobutton eine Sprache ausgewählt hat und am Ende auf der jeweiligen Sprache (gab aber nur 2 zur Auswahl) "Guten Morgen, ... (hier wird der Name eingefügt)!". Und daraus sollen wir innerhalb der nächsten Stunden ein Programm machen, in dem unser Ver- und Entschlüsselungsprogramm eingebunden ist.

Das heißt wir brauchen:
- 2 Eingabefelder (Für Klar-/Geheimtext und für Schlüsseltext)
- Die Beiden Radiobutton (einmal für Ver- und einmal für Entschlüsselung)
- ein "Ausgabefeld" wo am Schluss der ver bzw. entschlüsselte Text steht

Das Problem ist, wir sind noch nicht so weit, dass wir dies alles umsetzen können. Wir sollen erstmal alle, was wir schon können so herrichten, dass der fehlende Teil nur noch eingefügt werden muss. Damit wäre ich so weit:

Code: Alles auswählen

laenge = 500

def begr(event):
    art=s.get()
    name=t.get()
    if art == 1:
        HIER MUSS NOCH WAS EINGEFÜGT WERDEN
    else:
        HIER MUSS NOCH WAS EINGEFÜGT WERDEN



root = Tk()
s = IntVar()
t = StringVar()

root.title('Programm zum Ver- und Entschlüsseln')

c = Canvas(root)
c['height']=laenge
c['width']=laenge*1.4
c['borderwidth']=2
c['relief']=RAISED
c.pack()

s1=Label(c)
s1['text']='Geben Sie Ihren Text ein:'
s1.place(relx=0.05,rely=0.075,anchor=W)

e1=Entry(c,width=25,textvariable=t)
e1.place(relx=0.05,rely=0.15,anchor=W)

rb1=Radiobutton(c,text='Verschlüsseln',value=1,variable=s)
rb2=Radiobutton(c,text='Entschlüsseln',value=2,variable=s)
rb2.select()
rb1.place(relx=0.05,rely=0.35,anchor=W)
rb2.place(relx=0.05,rely=0.42,anchor=W)

s2=Label(c,width=25,bg='blue')
s2.place(relx=0.45,rely=0.35,anchor=W)


b1 = Button(c)
b1['text'] = 'Übersetzen'
b1.bind('<Button>',begr)
b1.place(relx=0.5,rely=0.65,anchor=S)


root.mainloop()
Um nun einen guten Eindruck beim Lehrer zu machen und um schnell weiter zu kommen, würde ich euch jetzt bitten, dass ihr mir erklärt bzw. macht und dann sagt, was was bedeutet, wie ich dieses Programm so optimieren kann, dass es zum Wunschprogramm wird.

Ich würde mich über Hilfe sehr freuen und wäre euch sehr verbunden =)

Liebe Grüße Muh-Kuh

€: Ich möchte klarstellen, dass ich nicht verlange, dass meine Hausaufgaben gemacht werden! Diese Aufgabe ist weder ein Projekt noch sonst irgendwas, was benotet wird! Aber da ich Interesse daran habe, voranzukommen und wir nur selten Informatik haben, suche ich hier Hilfe :)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mannomann, der Code ist ziemlich übel. Zu befürchten ist, dass manches davon aus dem vom Lehrer vorgegebenen Code stammt, das macht die Sache dann eigentlich noch schlimmer.

- Der place()-Geometriemanager ist eine Plage. Weg damit. Wenn der Lehrer nix anderes kennt. Übel. Auch für dich.
- Überleg dir aussagekräftigere Namen für die Bezeichner (Variablen, Funktionen).
- Das Festlegen von Eigenschaften für die Widgets ist noch very old-style. Das stammt noch aus einem sehr frühen Stadium von Tkinter, als das nur über Dictionary-Zugriff möglich war. Das ist einige Jahre her. Es funktioniert zwar nach wie vor, ist aber hässlich und im Fall deines Canvas z.B. auch unpraktisch, weil man mittels der config()-Methode alle Eigenschaften auf einmal festlegen kann. Ein Canvas würde man im übrigen zur Lösung des von dir beschriebenen Problem überhaupt nicht verwenden.
- Buttons haben einen Schlüsselwortparameter command, um beim Buttonklick ein Event auslösen. Eine Bindung mittels "bind" ist unnötig.

Wenn du was über Tkinter lernen willst, kannst du dich hier schlau machen:
http://infohost.nmt.edu/tcc/help/pubs/tkinter/
http://effbot.org/tkinterbook/tkinter-index.htm
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Muh Kuh

Hier dein leicht angepasstes Skript:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

# wuf_ref: first_gui_01_01.py

import Tkinter as tk

TEXT_TITLE = 'Programm zum Ver- und Entschlüsseln'
TEXT_LABEL1 = 'Geben Sie Ihren Text ein:'

laenge = 500

def begr():
    art=s.get()
    name=t.get()
    if art == 1:
#        HIER MUSS NOCH WAS EINGEFÜGT WERDEN
        pass
    else:
#        HIER MUSS NOCH WAS EINGEFÜGT WERDEN
        pass

root = tk.Tk()
root.title(TEXT_TITLE)

s = tk.IntVar()
t = tk.StringVar()

canvas = tk.Canvas(root, height=laenge, width=laenge*1.4, bd=2,
    relief='raised')
canvas.pack()

label1 = tk.Label(canvas, text=TEXT_LABEL1)
label1.place(relx=0.05, rely=0.075, anchor='w')

entry1 = tk.Entry(canvas, width=25, textvariable=t)
entry1.place(relx=0.05, rely=0.15, anchor='w')

radiobutton1 = tk.Radiobutton(canvas, text='Verschlüsseln', value=1,
    variable=s)
radiobutton2 = tk.Radiobutton(canvas, text='Entschlüsseln', value=2,
    variable=s)
radiobutton2.select()
radiobutton1.place(relx=0.05, rely=0.35, anchor='w')
radiobutton2.place(relx=0.05, rely=0.42, anchor='w')

label2 = tk.Label(canvas, width=25, bg='blue')
label2.place(relx=0.45, rely=0.35, anchor='w')

button1 = tk.Button(canvas, text='Übersetzen', command=begr)
button1.place(relx=0.5, rely=0.65, anchor='s')

root.mainloop()
numerix hat geschrieben:Der place()-Geometriemanager ist eine Plage. Weg damit.
Wenn an Stelle absoluter Positionsangaben relative (relx & rely) benützt werden, finde ich es persönlich nicht so schlimm.

Gruss wuf :wink: Muh!
Take it easy Mates!
BlackJack

@wuf: Kann es bei relativen Angaben nicht auch passieren, dass Elemente sich überlappen, bis hin zur Unbenutzbarkeit der GUI?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

@ BlackJack: Habe ich so nicht behauptet. Es kann natürlich schon zu unschönen Überlappungen kommen. Bei seinem Skript bei dem eine Canvas als Hauptbehälter dient kann der Pack-Layoutmanager aber nicht so angewendet werden wie man gerne möchte. Da müssen eigentlich die Label-, Entry-, Radiobuttons & Buttons in hierfür vorgesehene Canvas-Fenster-Objekte eingebettet werden. Diese Fenster-Objekte können dann aber nur mit den absoluten Positionsangaben x & y platziert werden oder man automatisiert dies softwaremässig. Damit man den Pack-Layoutmanager ideal einsetzen kann muss 'Muh Kuh' sich überlegen ob er effektiv eine Canvas als Hintergrund für alle Bedienungs-Widgetobjekte möchte oder die Canvas in ein einem eigenen Bereich platzieren.

Gruss wuf :wink:
Take it easy Mates!
BlackJack

@wuf: Naja ich finde den Einsatz von Canvas hier sowieso etwas fragwürdig. IMHO das falsche "Werkzeug" für diese Aufgabe.
Muh-Kuh
User
Beiträge: 9
Registriert: Montag 22. Februar 2010, 21:30

@ wuf: Großes Dankeschön, so ist das alles schonmal viel einfacher zu erkennen und zuzuordenen :D Werd in der nächsten Stunde erstmal meinen Lehrer drauf ansprechen ,warum er das so und nicht anders schreibt ;)

Ich habe jetzt noch ein 3. Label für die Codezahl zum Ver- und Entschlüsseln und einen Entry dafür eingebaut.
Sieht dann so aus:

Code: Alles auswählen

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

# wuf_ref: first_gui_01_01.py 

import Tkinter as tk 

TEXT_TITLE = 'Programm zum Ver- und Entschlüsseln' 
TEXT_LABEL1 = 'Geben Sie Ihren Text ein:'
TEXT_LABEL2 = 'Geben Sie Ihr Codewort ein:'

laenge = 500 

def begr(): 
    art=s.get() 
    name=t.get() 
    if art == 1: 
#        HIER MUSS NOCH WAS EINGEFÜGT WERDEN 
        pass 
    else: 
#        HIER MUSS NOCH WAS EINGEFÜGT WERDEN 
        pass 

root = tk.Tk() 
root.title(TEXT_TITLE) 

s = tk.IntVar() 
t = tk.StringVar()
t2 = tk.StringVar()

canvas = tk.Canvas(root, height=laenge, width=laenge*1.4, bd=2, 
    relief='raised') 
canvas.pack() 

label1 = tk.Label(canvas, text=TEXT_LABEL1) 
label1.place(relx=0.05, rely=0.075, anchor='w') 

entry1 = tk.Entry(canvas, width=25, textvariable=t) 
entry1.place(relx=0.05, rely=0.15, anchor='w')

label2 = tk.Label(canvas, text=TEXT_LABEL2) 
label2.place(relx=0.45, rely=0.075, anchor='w')

entry3 = tk.Entry(canvas, width=25, textvariable=t2) 
entry3.place(relx=0.45, rely=0.15, anchor='w')

radiobutton1 = tk.Radiobutton(canvas, text='Verschlüsseln', value=1, 
    variable=s) 
radiobutton2 = tk.Radiobutton(canvas, text='Entschlüsseln', value=2, 
    variable=s) 
radiobutton2.select()

radiobutton1.place(relx=0.05, rely=0.35, anchor='w') 
radiobutton2.place(relx=0.05, rely=0.42, anchor='w') 

label3 = tk.Label(canvas, width=25, bg='white') 
label3.place(relx=0.45, rely=0.35, anchor='w') 

button1 = tk.Button(canvas, text='Übersetzen', command=begr) 
button1.place(relx=0.5, rely=0.65, anchor='s') 

root.mainloop()

Wo muss ich jetzt genau reinschreiben, wie verschlüsselt und entschlüsselt wird? Also wo muss ich die beiden Programm rein tun? Und einfach nur rein tun, oder muss ich noch irgendwas beachten.

Dann noch eine kurze Frage nebenbei: Wo kann ich genau sehen, wo welche Position ist? Also damit ich weiß welche place-Werte ich eingeben muss, um an die gewünschte Posi zu kommen. Kann man das irgendwie gucken, oder muss man solange Zahlen eingeben, bis es an der gewünschten Stelle ist?

Liebe Grüße Muh

€: Über was redet ihr da eigentlich? Ich versteh davon kein Wort :( Was ist Canvas?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Muh-Kuh hat geschrieben:Über was redet ihr da eigentlich? Ich versteh davon kein Wort :( Was ist Canvas?
Hast du deinen "eigenen" Code mal angesehen? -> Zeile 31 ...
Und: Solche Fragen kannst du dir selbst beantworten. Ich habe dir oben zwei wichtige Links zur Tkinter-Doku genannt. Lesen musst du selbst.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Du kannst deine "Verschlüsselun und Entschlüsselungen" importieren, indem du das Skript mit der Verschlüsselung im selben Verzeichnis hast wie das Skript mit der GUI

Code: Alles auswählen

import meine_verschluesselung # Nur ein Beispielname
# Deine Datei mit der Verschlüsselung muss dann natürlich meine_verschlüsselung.py heißen
#
# Verwenden dann so:
meine_verschluesselung.verschluesselung() #Argumente fehlen
meine_verschluesselung.entschluesselung() # Argumente fehlen!
Oder du kopierst die Funktionen in dein Skript mit der GUI und benutzt sie einfach so wie du die Funktionen immer verwendet hast
the more they change the more they stay the same
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Muh-Kuh

Das ist in deinem Skript der Hauptbehälter in dem alle weiteren Widgets wie Labels, Radiobuttons, Buttons, Entrys usw. untergebracht (eingebettet sind). Das Canvas-Widget wird normalerweise für die Darstellung von garfischen Objekten wie Linien, Kreise, Rechtecke usw. verwendet. Wenn du keine grafischen Objekte anzeigen musst kann man diese Canvas-Widget weglassen und alle jetzt verwendeten Widgets auf das Hauptfenster 'root' verpflanzen.

Dann würde dein Skript so aussehen:
http://paste.pocoo.org/show/181546/

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

......... Hier noch dein Skript mit Einsatz des Pack-Layoutmanagers zum experimentieren:
http://paste.pocoo.org/show/181559/

Beim Einsatz dieses viel erwähnten Layoutmanagers ist eine gut überlegte Planung des Fensterlayouts deiner Anwendung nötig. Ansonsten kann das ganze zu einer zermürbenden Spielerei ausarten. Die Layoutstruktur und Gruppierung von Widgets setzt sich hauptsächlich aus Frame-Widgets zusammen.

Gruss wuf :wink:
Take it easy Mates!
Muh-Kuh
User
Beiträge: 9
Registriert: Montag 22. Februar 2010, 21:30

Also Canvas ist sinnvoll, nur eigentlich noch nicht bei mir ,weil ich noch keine Linien, Formen oder sonst was brauche, oder wie?

Wenn ich jetzt oben meine kleinen Programme zum Ver- und Entschlüsseln einfüge, dann fehlt ja noch was.

Aber wie kann ich klar machen, dass der Eingabetext aus entry1 bzw. entry2 der Klar/Geheimtext bzw. das Codewort ist? :O

Ich hab irgendwie grad voll keine Ahnung, was ich da definieren muss :(

Liebe Grüße Muh
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Muh-Kuh
Muh-Kuh hat geschrieben:Also Canvas ist sinnvoll, nur eigentlich noch nicht bei mir ,weil ich noch keine Linien, Formen oder sonst was brauche, oder wie?
Korrekt!
Muh-Kuh hat geschrieben:Wenn ich jetzt oben meine kleinen Programme zum Ver- und Entschlüsseln einfüge, dann fehlt ja noch was.
Richtig! Das Aufrufen der Funktionen 'verschluesselung' und 'entschluesselung' in Abhängikeit der gesetzten Radioschaltflächen.

Kannst du einmal kurz beschreiben wie du bei der Eingabe bzw. Bedienung vorgehen möchtest?

Gruss wuf :wink:
Take it easy Mates!
Muh-Kuh
User
Beiträge: 9
Registriert: Montag 22. Februar 2010, 21:30

Code: Alles auswählen

# -*- coding: cp1252 -*-
import Tkinter as tk 

TEXT_TITLE = 'Programm zum Ver- und Entschlüsseln' 
TEXT_LABEL1 = 'Geben Sie Ihren Text ein:'
TEXT_LABEL2 = 'Geben Sie Ihr Codewort ein:'

laenge = 500 

def begr(): 
    art=s.get() 
    name=t.get() 
    if art == 1:
        def verschluesselung(klartext,schluesseltext):
            geheimtext=''
            n=len(klartext)
            k=len(schluesseltext)
            while k<n:
                schluesseltext=schluesseltext+schluesseltext
                k=len(schluesseltext)
            for z in range(n):
                code1=ord(klartext[z])-96
                code2=ord(schluesseltext[z])-96
                code3=code1+code2
                if code3>26:
                    code3=code3-26
                zeichen=chr(code3+96)
                geheimtext=geheimtext+zeichen
            print geheimtext
    else:
        def entschluesselung(geheimtext,schluesseltext):
            klartext=''
            n=len(geheimtext)
            k=len(schluesseltext)
            while k<n:
                schluesseltext=schluesseltext+schluesseltext
                k=len(schluesseltext)
            for z in range(n):
                code1=ord(geheimtext[z])-96
                code2=ord(schluesseltext[z])-96
                code3=code1-code2
                if code3<1:
                    code3=code3+26
                code3=code3+96
                zeichen=chr(code3)
                klartext=klartext+zeichen
            print klartext

root = tk.Tk() 
root.title(TEXT_TITLE) 

s = tk.IntVar() 
t = tk.StringVar()
t2 = tk.StringVar()

canvas = tk.Canvas(root, height=laenge, width=laenge*1.4, bd=2, 
    relief='raised') 
canvas.pack() 

# Erstes Eingabefeld
label1 = tk.Label(canvas, text=TEXT_LABEL1) 
label1.place(relx=0.05, rely=0.075, anchor='w') 

entry1 = tk.Entry(canvas, width=25, textvariable=t) 
entry1.place(relx=0.05, rely=0.15, anchor='w')

# Zweites Eingabefeld
label2 = tk.Label(canvas, text=TEXT_LABEL2) 
label2.place(relx=0.45, rely=0.075, anchor='w')

entry2 = tk.Entry(canvas, width=25, textvariable=t2) 
entry2.place(relx=0.45, rely=0.15, anchor='w')

# Auswahlmöglichkeit
radiobutton1 = tk.Radiobutton(canvas, text='Verschlüsseln', value=1, 
    variable=s) 
radiobutton2 = tk.Radiobutton(canvas, text='Entschlüsseln', value=2, 
    variable=s) 
radiobutton2.select()

radiobutton1.place(relx=0.05, rely=0.35, anchor='w') 
radiobutton2.place(relx=0.05, rely=0.42, anchor='w') 

# Ausgabefeld
label3 = tk.Label(canvas, width=25, bg='black') 
label3.place(relx=0.45, rely=0.35, anchor='w') 

# Knopf ^^
button1 = tk.Button(canvas, text='Übersetzen', command=begr) 
button1.place(relx=0.5, rely=0.65, anchor='s') 

root.mainloop()

Also so weit bin ich ja schon.

Funktionieren soll es wie folgt:

Man gibt oben seinen Text ein und ein Codewort und wählt dann aus, ob man den Text verschlüsselt oder entschlüsselt haben möchte. Erscheinen tut dann das Ergebnis.

Es muss also noch so verändert werden, dass das verschluesselung-Programm bzw. das entschluesselung-Programm den oben eingegebenen Text als klartext/geheimtext annehmen und das Codewort von oben als schluesseltext.

--> entry1 soll als klartext/geheimtext angesehen werden
--> entry 2 soll das schluesseltext angesehen werden
--> label 3 soll das Endprodukt anzeigen :)

Liebe Grüße Muh
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Muh-Kuh

Die Funktionen:

Code: Alles auswählen

def verschluesselung(klartext,schluesseltext):
und

Code: Alles auswählen

def entschluesselung(geheimtext,schluesseltext):
würde ich nicht in Funktion:

Code: Alles auswählen

def begr():
einbetten sondern als eigenständige Funktionen oberhalb:

Code: Alles auswählen

def begr():
sondern als eigenständige Funktionen platzieren.

Ist es richtig, dass du das Eingabefeld-1 (entry1) für die Eingabe des Klartextes bzw. Geheimtextes verwendest?

Gruss wuf :wink:
Take it easy Mates!
Muh-Kuh
User
Beiträge: 9
Registriert: Montag 22. Februar 2010, 21:30

Hm ok, dann als eigenständige Funktion. Aber wie kann ich das dann miteinander verknüpfen, also dass die Entry's als Klartext bzw. Schluesseltext angesehen werden?

Ja Entry1 soll Klartext bzw. Geheimtext werden ;)
Und Entry 2 der Schluesseltext

Liebe Grüße Muh
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

....... Ok. Du kannst dann die Funktionen:

Code: Alles auswählen

def verschluesselung(klartext,schluesseltext):
und

Code: Alles auswählen

def entschluesselung(geheimtext,schluesseltext):
von

Code: Alles auswählen

def begr():
in Abhängigkeit von 'art' aufrufen. Verstehst du was ich meine?

Gruss wuf
Take it easy Mates!
Muh-Kuh
User
Beiträge: 9
Registriert: Montag 22. Februar 2010, 21:30

Nein, tut mir Leid, komme nicht ganz mit. Ich dachte das hier ist in Abhängigkeit von "def begr():"

Code: Alles auswählen

def begr(): 
    art=s.get() 
    name=t.get() 
    if art == 1:
        def verschluesselung(klartext,schluesseltext):
            geheimtext=''
            n=len(klartext)
            k=len(schluesseltext)
            while k<n:
                schluesseltext=schluesseltext+schluesseltext
                k=len(schluesseltext)
            for z in range(n):
                code1=ord(klartext[z])-96
                code2=ord(schluesseltext[z])-96
                code3=code1+code2
                if code3>26:
                    code3=code3-26
                zeichen=chr(code3+96)
                geheimtext=geheimtext+zeichen
            print geheimtext
    else:
        def entschluesselung(geheimtext,schluesseltext):
            klartext=''
            n=len(geheimtext)
            k=len(schluesseltext)
            while k<n:
                schluesseltext=schluesseltext+schluesseltext
                k=len(schluesseltext)
            for z in range(n):
                code1=ord(geheimtext[z])-96
                code2=ord(schluesseltext[z])-96
                code3=code1-code2
                if code3<1:
                    code3=code3+26
                code3=code3+96
                zeichen=chr(code3)
                klartext=klartext+zeichen
            print klartext
Also eigentlich muss ich dem Programm ja nur sagen, dass wenn der Radiobutton "Verschlüsseln" ausgewählt ist, dass auch "verschluesselung" ausgeführt werden soll. Und das hab ich doch mit obigem Befehl oder nicht?

Was dann noch fehlt ist, dass das Programm als Geheimtext/Klartext den oben eingegebenen Text verwendet und als Schluesseltext den oben eingegebenen Code :) Genau das ist ja das was ich nicht kann :(

Liebe Grüße Muh

PS: Danke nochmal ,dass du dir so viel Mühe gibst mir weiterzuhelfen ;)
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Muh-Kuh

Ich würde die folgenden Konstanten:

Code: Alles auswählen

TEXT_TITLE = 'Programm zum Ver- und Entschlüsseln'
TEXT_LABEL1 = 'Geben Sie Ihren Text ein:'
TEXT_LABEL2 = 'Geben Sie Ihr Codewort ein:'
noch ergänzen mit:

Code: Alles auswählen

MODE_ENCODE = 1
MODE_DECODE = 2
Dann würde ich folgende Funktion noch wie folgt modifizieren:

Code: Alles auswählen

def begr():

    art = s.get()
    entry1 = t.get()
    entry2 = t2.get()

#    print 'For debuging only' ,entry1, entry2, art
#    print 'For debuging only', list(entry1), list(entry2)

    if art == MODE_ENCODE:
        verschluesselung(entry1, entry2)

    if art == MODE_DECODE:
        entschluesselung(entry1, entry2)
Kannst du dies einmal durchführen

Gruss wuf :wink:
Take it easy Mates!
Muh-Kuh
User
Beiträge: 9
Registriert: Montag 22. Februar 2010, 21:30

Ok, das ergibt Sinn :)

Aber warum funktioniert es nicht? :(

Es wird einfach keine Verschlüsselung angezeigt in dem label3 -.-

Ich versteh nicht, wo der Fehler ist. Im IDLE wird ja die richtige Lösung angezeigt oO

Hier nochmal das komplette Programm:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import Tkinter as tk 

TEXT_TITLE = 'Programm zum Ver- und Entschlüsseln' 
TEXT_LABEL1 = 'Geben Sie Ihren Text ein:'
TEXT_LABEL2 = 'Geben Sie Ihr Codewort ein:'
MODE_ENCODE = 1 
MODE_DECODE = 2

laenge = 500 

def begr(): 

    art = s.get() 
    entry1 = t.get() 
    entry2 = t2.get() 

#    print 'For debuging only' ,entry1, entry2, art 
#    print 'For debuging only', list(entry1), list(entry2) 

    if art == MODE_ENCODE: 
        verschluesselung(entry1, entry2) 

    if art == MODE_DECODE: 
        entschluesselung(entry1, entry2)

def verschluesselung(klartext,schluesseltext):
            geheimtext=''
            n=len(klartext)
            k=len(schluesseltext)
            while k<n:
                schluesseltext=schluesseltext+schluesseltext
                k=len(schluesseltext)
            for z in range(n):
                code1=ord(klartext[z])-96
                code2=ord(schluesseltext[z])-96
                code3=code1+code2
                if code3>26:
                    code3=code3-26
                zeichen=chr(code3+96)
                geheimtext=geheimtext+zeichen
            print geheimtext

def entschluesselung(geheimtext,schluesseltext):
            klartext=''
            n=len(geheimtext)
            k=len(schluesseltext)
            while k<n:
                schluesseltext=schluesseltext+schluesseltext
                k=len(schluesseltext)
            for z in range(n):
                code1=ord(geheimtext[z])-96
                code2=ord(schluesseltext[z])-96
                code3=code1-code2
                if code3<1:
                    code3=code3+26
                code3=code3+96
                zeichen=chr(code3)
                klartext=klartext+zeichen
            print klartext


root = tk.Tk() 
root.title(TEXT_TITLE) 

s = tk.IntVar() 
t = tk.StringVar()
t2 = tk.StringVar()

canvas = tk.Canvas(root, height=laenge, width=laenge*1.4, bd=2, 
    relief='raised') 
canvas.pack() 

# Erstes Eingabefeld
label1 = tk.Label(canvas, text=TEXT_LABEL1) 
label1.place(relx=0.05, rely=0.075, anchor='w') 

entry1 = tk.Entry(canvas, width=25, textvariable=t) 
entry1.place(relx=0.05, rely=0.15, anchor='w')

# Zweites Eingabefeld
label2 = tk.Label(canvas, text=TEXT_LABEL2) 
label2.place(relx=0.45, rely=0.075, anchor='w')

entry2 = tk.Entry(canvas, width=25, textvariable=t2) 
entry2.place(relx=0.45, rely=0.15, anchor='w')

# Auswahlmöglichkeit
radiobutton1 = tk.Radiobutton(canvas, text='Verschlüsseln', value=1, 
    variable=s) 
radiobutton2 = tk.Radiobutton(canvas, text='Entschlüsseln', value=2, 
    variable=s) 
radiobutton2.select()

radiobutton1.place(relx=0.05, rely=0.35, anchor='w') 
radiobutton2.place(relx=0.05, rely=0.42, anchor='w') 

# Ausgabefeld
label3 = tk.Label(canvas, width=25, bg='white') 
label3.place(relx=0.45, rely=0.35, anchor='w') 

# Knopf ^^
button1 = tk.Button(canvas, text='Übersetzen', command=begr) 
button1.place(relx=0.5, rely=0.65, anchor='s') 

root.mainloop()
Liebe Grüße Muh
Antworten