Seite 1 von 2

Textfelder auslesen

Verfasst: Donnerstag 15. Mai 2008, 18:31
von nightm4r3^
High all!
Ich habe eine Frage zu Textfelder in Tkinter.
Wie ist es möglich (oder ist es überhaupt möglich) Textfelder auszulesen um zum Beispiel die Länge der eingegebenen Zeichen zu ermitteln.

mfg nightm4r3^

Verfasst: Donnerstag 15. Mai 2008, 19:27
von numerix
Zitat von http://effbot.org/tkinterbook/text.htm
To fetch the text contents of the widget, use the get method:
contents = text.get(1.0, END)

Verfasst: Samstag 17. Mai 2008, 11:48
von nightm4r3^
Ich habe es jetzt so gemacht, aber er gibt mir jetzt die Fehlermeldung:

Code: Alles auswählen

NameError: global name 'END' is not defined
Woran liegt das?

Verfasst: Samstag 17. Mai 2008, 13:31
von BlackJack
Daran, dass Du immer noch nicht mit Namensräumen umgehen kannst. Der Name ist in Deinem Modul nicht definiert. Nun überleg doch mal, wo der definiert sein könnte.

Verfasst: Samstag 17. Mai 2008, 14:44
von numerix
Ich geb dir mal 'nen Tipp:

END ist eine Tkinter-Konstante.
Das Zitat mit der Beispielzeile setzt voraus, dass Tkinter mitttels Sternchen-Import importiert wurde. Das hast du anscheinend nicht gemacht und das ist auch gut so.

Verfasst: Samstag 17. Mai 2008, 16:06
von nightm4r3^
Ja ich habe es mit

Code: Alles auswählen

import Tkinter as tk
gemacht.
Aber ich muss ja jetzt wohl kaum die Eingabe von 1.0 bis tk.END auslesen oder?

Verfasst: Samstag 17. Mai 2008, 16:20
von numerix
nightm4r3^ hat geschrieben:Aber ich muss ja jetzt wohl kaum die Eingabe von 1.0 bis tk.END auslesen oder?
:roll: Versteh ich nicht? Ist dir das zu viel Arbeit oder wie ist die Frage gemeint?
Ansonsten - falls es nicht zu viel Arbeit ist: Probier es doch mal ...

Verfasst: Samstag 17. Mai 2008, 16:29
von nightm4r3^
ja jetzt kommt:

Code: Alles auswählen

TypeError: get() takes exactly 1 argument (3 given)
tut mir ja leid wenn ich mich so dumm anstell

Verfasst: Samstag 17. Mai 2008, 16:53
von numerix
nightm4r3^ hat geschrieben:tut mir ja leid wenn ich mich so dumm anstell
So schlimm ist das nicht, so lange du nicht aufgibst ...

Die Fehlermeldung deutet darauf hin, dass du mit "Textfeld" (OP) kein Text-Widget meinst (das dachte ich und darauf bezog sich die bisherige Hilfe), sondern ein Entry-Widget. Da ein Entry-Widget nur eine Zeile umfasst, braucht get() da auch keine Parameter.

Also: Versuch es damit.

Verfasst: Samstag 17. Mai 2008, 16:59
von nightm4r3^
Also ich erläutere mal gerade mein Problem komplett:

Ich bin gerade dabei ein Programm zum chiffrieren zu schreiben. Das wäre auch alles gar kein Problem, aber in ein Entry Feld einen Text einzugeben der mehrere Zeilen lang ist, ist sehr unschön. Deshalb dachte ich mir mach ich das mit einem Text Feld.

So das ist das Problem. Wie kann ich nun diese Feld auslesen und in einer Definition weiterverrarbeiten.

Verfasst: Samstag 17. Mai 2008, 17:36
von BlackJack
Bei einem `Text`-Widget dürftest Du aber die Fehlermeldung nicht bekommen, denn dessen `get()` nimmt drei Argumente entgegen:

Code: Alles auswählen

In [53]: tk.Text.get?
Type:           instancemethod
Base Class:     <type 'instancemethod'>
String Form:    <unbound method Text.get>
Namespace:      Interactive
File:           /home/bj/lib-tk/Tkinter.py
Definition:     tk.Text.get(self, index1, index2=None)
Docstring:
    Return the text from INDEX1 to INDEX2 (not included).

Verfasst: Sonntag 18. Mai 2008, 10:44
von nightm4r3^
ich versteh es ja selber nicht. ich habe ein Textfeld mit dem Namen "text" und wenn ich es mit text.get(1.0, END) auslesen will, kommt ein Name Error.

Verfasst: Sonntag 18. Mai 2008, 13:13
von Leonidas
Naja, zu ``tk.END`` wurde dir ja schon geraten...

Verfasst: Sonntag 18. Mai 2008, 13:36
von nightm4r3^
ja und wenn ich es mit tk.END mache, dann kommt der attribute Fehler.

Verfasst: Sonntag 18. Mai 2008, 13:47
von Leonidas
Und wenn du uns noch den ganzen Traceback zeigst, dann könnte man mit deiner Aussage vielleicht auch noch etwas anfangen.

Verfasst: Sonntag 18. Mai 2008, 13:50
von nightm4r3^

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.

Verfasst: Sonntag 18. Mai 2008, 14:35
von Leonidas
Die Exception passt nicht zum Code. Wie wärs wenn du den *richtigen* Code nimmst und die dazu passende Exception herausrückst?

Verfasst: Sonntag 18. Mai 2008, 15:09
von nightm4r3^
was soll ich machen? wieso passt die net zum code

Verfasst: Sonntag 18. Mai 2008, 15:13
von pudeldestodes
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.

Verfasst: Sonntag 18. Mai 2008, 16:38
von wuf
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: