Textfelder auslesen

Fragen zu Tkinter.
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Sonntag 18. Mai 2008, 13:50

Code: Alles auswählen

import Tkinter as tk

def verschluesseln(text, versch):
    laenge=len(text.get(1.0, tk.END))
    text=text.upper()
    versch=versch%26
    chiffre=''
    for i in range(0,laenge):
        if text[i]==' ':
            chiffre+=' '
        elif 65<=ord(text[i])+versch<=90:
            chiffre+=chr(ord(text.get(1.0, tk.END)[i])+versch.get())
        elif ord(text.get()[i])+versch.get()>90:
            chiffre+=chr(ord(text.get(1.0, tk.END)[i])+versch.get()-26)
        else:
            chiffre+=chr(ord(text.get(1.0, tk.END)[i])+versch.get()+26)
    print chiffre

def chiff():
    root.geometry('800x400')
    ausgabe=tk.Text(root, text=verschluesseln(text.get(1.0, tk.END), versch.get()), width=50, height=20)
    ausabe.place(x=410, y=70)

def dechiff():
    root.geometry('450x400')
    
    
                   
root=tk.Tk()
root.geometry('450x400')
root.title('Verschlüsselung')
root.label=tk.Label(root, text='Chiffrierung und Dechiffrierung', font=('Verdana',16,'bold'))
root.label.place(x=10, y=20)
root.label2=tk.Label(root, text='Bitte geben Sie den zu verschlüsselnden Text ein: ')
root.label2.place(x=10, y=50)
versch=tk.Entry(root)
versch.place(x=10, y=70)
text=tk.Text(root, width=50, height=20)
text.place(x=10, y=100)
root.button=tk.Button(root, text='Chiffrieren',
                      command=chiff)
root.button.place(x=370, y=100)
root.button=tk.Button(root, text='Dechiffrieren',
                      command=dechiff)
root.button.place(x=370, y=130)
root.mainloop()
So Sieht das Programm bis jetzt aus.


Und das ist der Fehler:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "F:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
  File "F:\Python25\Python Programme(self)\verschluesseln.py", line 25, in chiff
    ausgabe=tk.Text(root, text=verschluesseln(text.get(), versch.get()), width=50, height=20)
TypeError: get() takes at least 2 arguments (1 given)

Ich weiß hier gefällt vielen mein Programmierstil nicht, aber das soll jetzt mal egal sein.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 18. Mai 2008, 14:35

Die Exception passt nicht zum Code. Wie wärs wenn du den *richtigen* Code nimmst und die dazu passende Exception herausrückst?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Sonntag 18. Mai 2008, 15:09

was soll ich machen? wieso passt die net zum code
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Sonntag 18. Mai 2008, 15:13

Der Code, den du gepostet hast, läuft ohne die von dir gezeigte Fehlermeldung. Geht aber trotzdem nicht, weil du da total konfuse Sachen machst, aber zumindest die von dir monierte Fehlermeldung tauch nicht auf.

Und die Exception kann da gar nicht drauf passen, weil die darin aufgeführte Zeile in deinem geposteten Quelltext gar nicht in der Form existiert, sondern schon korrigiert ist.
Benutzeravatar
wuf
User
Beiträge: 1419
Registriert: Sonntag 8. Juni 2003, 09:50

Sonntag 18. Mai 2008, 16:38

Hallo nightm4r3^

Ich bin am debugen des Verschlüsselungskriptes.

Vorab:
a) Da gibt es ein Entry-Widget 'versch'
b) Ein Text-Widget 'text'

Ich nehme an Du gibst den zu verschlüsselnden
Text in das Entry-Widget 'versch' ein und gibst
mit dem aktivierten der Schaltfläche 'Chiffrieren'
die Verschlüsselung ins grosse Text-Widget 'text'
aus.

Meine bis jetzt gemachten Feststellungen sind:

a) In Zeile 5 steht:
laenge=len(text.get(1.0, tk.END))
Meiner Meinung nach sollte dort folgendes stehen:
laenge=len(text)
Da Du in der Funktion 'chiff' beim Aufruf der
Funktion 'verschluesseln' als Argument für 'text'
text.get(1.0, tk.END) schon ausgeführt wird
und in der Funktion 'verschluesseln' der
Parameter 'text' als Zeichenkette verfügbar ist.
Auf den Parameter 'text' kann dann die Funktion
len('text') problemlos angewendet werden.

b) In Zeile 23 steht:
ausabe.place(x=410, y=70)
Muss aber heissen:
ausgabe.place(x=410, y=70)

Kannst Du eventuell einen kurzen Beschrieb des
Eingabe-Handlings bzw. über den geplanten Ablauf
des Verschlüsselung-Prozesses erstellen.

Gruss wuf :wink:
Take it easy Mates!
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Sonntag 18. Mai 2008, 17:42

Tut mir leid aber leider Falsch verstanden^^

Es handelt sich hier um eine Ceasar Verschlüsselung. Es ist erst sozusagen inder "beta" Phase, zuerst soll man in das Entry Widget die Zahl eingeben um wie viele Zeichen der Buchstabe verschoben werden soll, und in das Text Widget der zu verschlüsselnde Text. In einem neu erscheinendem Textfeld, soll dann der Text ausgegeben werden.

Beispiel:

Entryfeld: 2
Textfeld: Hallo
Neues Textfeld: Jcnnq


PS: versch=Verschiebung ;)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 18. Mai 2008, 17:53

nightm4r3^ hat geschrieben:was soll ich machen? wieso passt die net zum code
Die Zeile die da angemängelt wird ist:

Code: Alles auswählen

ausgabe=tk.Text(root, text=verschluesseln(text.get(), versch.get()), width=50, height=20) 
In dem von dir gezeigtem Code kommt diese Zeile gar nicht vor!

Stattdessen hast du so eine Zeile:

Code: Alles auswählen

ausgabe=tk.Text(root, text=verschluesseln(text.get(1.0, tk.END), versch.get()), width=50, height=20)
Also wie erwartest du, dass man dein Problem löst, wenn du selbst noch zusätzliche Probleme machst, indem du entweder den falschen Code oder die falsche Exception postest?!
My god, it's full of CARs! | Leonidasvoice vs Modvoice
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Sonntag 18. Mai 2008, 18:21

entschuldigung ich habe den falschen fehler gepostet

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "F:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
  File "F:\Python25\Python Programme(self)\verschluesseln.py", line 26, in chiff
    ausgabe=tk.Text(root, text=verschluesseln(text.get(1.0, tk.END), versch.get()), width=50, height=20)
  File "F:\Python25\Python Programme(self)\verschluesseln.py", line 9, in verschluesseln
    laenge=len(text.get(1.0, tk.END))
AttributeError: 'str' object has no attribute 'get'
Es kommt dieser Fehler
Benutzeravatar
wuf
User
Beiträge: 1419
Registriert: Sonntag 8. Juni 2003, 09:50

Sonntag 18. Mai 2008, 20:03

Hallo nightm4r3^

Ich bin leider kein Verschlüsselungs-Experte Hi!

Kannst Du bitte Deine Funktion 'verschluesseln'
einmal durch die folgende ersetzen und kontrol-
lieren was der am Ende der Funktion stehende
Befehl 'print chiffre' auf die Konsole ausgibt:

Code: Alles auswählen

def verschluesseln(text, versch):
	""" Verschlüsselungs-Algorithmus """
	
	#~~ Das Text-Widget liefert automatisch ein '\n' zur eingegebenen
	#   Textzeile mit. Das wird hier entfernt
	text = text.replace('\n','')
	
	#~~ Anzahl Zeichen des zu verschlüsselnden Textes
	laenge = len(text)
	
	text = text.upper()
	
	#~~ Modulo-Operator kann nur auf ganze Zahlen angewendet werden
	shift = int(versch)%26
	
	chiffre=''
	for i in range(0,laenge):
		if text[i]==' ':
			chiffre+=' '
		elif 65<=ord(text[i]) + shift<=90:
			chiffre += chr(ord(text[i])+int(versch))
		elif ord(text[i])+ shift >90:
			chiffre += chr(ord(text[i])+int(versch)-26)
		else:
			chiffre += chr(ord(text[i])+int(versch)+26)
	print chiffre
Gruss wuf :wink:
Take it easy Mates!
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Sonntag 18. Mai 2008, 20:14

Code: Alles auswählen

JCNNQ
Exception in Tkinter callback
Traceback (most recent call last):
  File "F:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
  File "F:\Python25\Python Programme(self)\verschluesseln.py", line 37, in chiff
    ausabe.place(x=410, y=70)
NameError: global name 'ausabe' is not defined
Also das Wort gibt er aus. Aber wo der Fehler jetzt liegt, weiß ich auch noch nicht^^
Benutzeravatar
wuf
User
Beiträge: 1419
Registriert: Sonntag 8. Juni 2003, 09:50

Sonntag 18. Mai 2008, 20:36

Hallo nightm4r3^

Die Fehlermeldung sagt:

Python findet den Name 'ausabe' nicht.
Der Grund ist dieser Name hast Du falsch
geschrieben. Du musst ihn auf ausgabe
umändern.

Der Fehlerhafte Namen befindet sich auf Zeile-37!

Viel Spass nightm4r3^ mit der Python & Tkinter-
Programmierung.

Gruss wuf :wink:
Take it easy Mates!
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Sonntag 18. Mai 2008, 20:41

und dir vielen dank wuf. ich glaube nicht das ich ohne deine hilfe geschafft hätte^^

aber eine frage hät ich noch. und zwar gibt mir das programm jetzt den chiffrierten text in der idle aus. wie bekomm ich ihn jetzt aber in das 2. textfeld?
Benutzeravatar
wuf
User
Beiträge: 1419
Registriert: Sonntag 8. Juni 2003, 09:50

Sonntag 18. Mai 2008, 21:21

Hallo nightm4r3^

Hier ist die Lösung für die Ausgabe des
verschlüsselten Textes:

Hänge am Schluss der Funktion 'verschluesseln'
unmittelbar nach dem Befehl 'print chiffre'
folgende Zeile an:

Code: Alles auswählen

return chiffre
Ersetze die Funktion chiff durch die folgende:

Code: Alles auswählen

def chiff():
	""" Ausgabe des verschlüsselten Textes """
	global text
	
	root.geometry('900x400')
	
	ausgabe = tk.Text(root,
		width  = 50,
		height = 20
		)
	ausgabe.place(x=500, y=100)
	
	chiffre   = verschluesseln(text.get(1.0, tk.END),versch.get()),
	ausgabe.insert(tk.END,chiffre)

Gruss wuf und good luck :wink:
Take it easy Mates!
Antworten