Textfelder auslesen

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

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^
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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)
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

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?
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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

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.
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).
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, zu ``tk.END`` wurde dir ja schon geraten...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

ja und wenn ich es mit tk.END mache, dann kommt der attribute Fehler.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und wenn du uns noch den ganzen Traceback zeigst, dann könnte man mit deiner Aussage vielleicht auch noch etwas anfangen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

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

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: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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!
Antworten