Seite 1 von 1

Eingabe Beschränkung

Verfasst: Mittwoch 8. Oktober 2008, 08:24
von tgooper
Hallo,

ich bastle an einer Dateneingabe Oberfläche mit Tkinter und wollte fragen, ob es beim Entry-Widget die Möglichkeit gibt, die Eingabe auf 4 Zeichen zu beschränken?

LG
Tgooper

Verfasst: Mittwoch 8. Oktober 2008, 08:40
von numerix
Geht es dir um die Breite des Widgets (d.h. 4 Zeichen breit) oder darum, dass man nach der Eingabe von 4 Zeichen kein weiteres mehr eingeben kann?

Verfasst: Mittwoch 8. Oktober 2008, 08:41
von sea-live
fixed = 4
limitiert auf 4 Eingaben

Verfasst: Mittwoch 8. Oktober 2008, 08:57
von sea-live
am schnellsten geht es jedoch in dem du beim lesen begrenzt

Code: Alles auswählen

eingabe = Entry(root,background='yellow',foreground='blue',font='courier',width=4)         ## Eingabezeile erzeugen
eingabe.pack()## und anzeigen

##  und beim lesen begrenzen ///// eingabe.delete(4,END)

Verfasst: Mittwoch 8. Oktober 2008, 09:32
von tgooper
Wo baue ich das fixed=4 ein?

Verfasst: Mittwoch 8. Oktober 2008, 09:56
von BlackJack
`fixed` gibt's nicht und auch der andere Vorschlag von sea-live begrenzt die Eingabe nicht, sondern macht nur die Anzeige des Eingabefeldes kleiner.

Man kann sich so ein `Entry` aber selber basteln:

Code: Alles auswählen

#!/usr/bin/env python
import Tkinter as tk


class MaxLengthEntry(tk.Entry):
    def __init__(self, master, max_length, textvariable=None, **args):
        self.max_length = max_length
        self._textvariable = textvariable
        if self._textvariable is None:
            self._textvariable = tk.StringVar()
        self._old_value = self._textvariable.get()
        self._textvariable.trace('w', self.validate)
        tk.Entry.__init__(self,
                          master,
                          textvariable=self._textvariable,
                          width=max_length,
                          **args)
    
    def validate(self, *args):
        text = self.get()
        if len(text) <= self.max_length:
            self._old_value = text
        else:
            self._textvariable.set(self._old_value)


def main():
    root = tk.Tk()
    entry = MaxLengthEntry(root, 4)
    entry.pack()
    root.mainloop()


if __name__ == '__main__':
    main()

Verfasst: Mittwoch 8. Oktober 2008, 18:23
von sea-live
@BlackJack
kann es sein das es Tkinter auch für andere Sprachen gibt ZB perl

Verfasst: Mittwoch 8. Oktober 2008, 19:52
von Leonidas
sea-live hat geschrieben:kann es sein das es Tkinter auch für andere Sprachen gibt ZB perl
Nein, Tkinter gibt es nur für Python. Tkinter nutzt aber ein Toolkit namens Tk, dass eigentlich immer im selben Atemzug wie Tcl genannt wird. Daher ist es möglich, Tk in Tcl oder anderen Sprachen die entsprechende Bindings haben zu nutzen.

Verfasst: Mittwoch 8. Oktober 2008, 21:31
von abgdf
Die Tk-Anbindung von Perl, also die Kombination Perl/Tk, ist schon auch recht bekannt.

Wenn Du auch Perl installiert hast (z.B. unter Linux), lohnt es sich oft auch für Python/Tkinter mal in "perldoc Tk", in diesem Fall also in "perldoc Tk::Entry", zu lesen.

Gruß

Verfasst: Donnerstag 9. Oktober 2008, 14:44
von wuf
Hallo BlackJack

Mir ist die Zeile 12 in deinem Code-Snippet aufgefallen

Code: Alles auswählen

self._textvariable.trace('w', self.validate)
Die Methode 'trace' ist neu für mich. Hast du diese selber erfunden oder gibt es eine nähere Beschreibung hierfür. Ich habe mich in meinen Unterlagen halb zu Tode gesucht.

Gruss wuf :wink:

Verfasst: Donnerstag 9. Oktober 2008, 15:42
von numerix
wuf hat geschrieben:Mir ist die Zeile 12 in deinem Code-Snippet aufgefallen

Code: Alles auswählen

self._textvariable.trace('w', self.validate)
Die Methode 'trace' ist neu für mich. Hast du diese selber erfunden oder gibt es eine nähere Beschreibung hierfür. Ich habe mich in meinen Unterlagen halb zu Tode gesucht.
Schritt 1:

Code: Alles auswählen

>>> import Tkinter
>>> root = Tkinter.Tk()
>>> print dir(Tkinter.StringVar())
['__del__', '__doc__', '__eq__', '__init__', '__module__', '__str__', '_default', '_master', '_name', '_tk', 'get', 'set', 'trace', 'trace_variable', 'trace_vdelete', 'trace_vinfo']
Aha. :idea:

Schritt 2:
Tkinter.py öffnen und nach "trace" suchen.
Zeile 207 (in meiner Version): Fündig werd!

Verfasst: Donnerstag 9. Oktober 2008, 15:47
von BlackJack
@wuf: http://effbot.org/tkinterbook/variable.htm

Der Effbot hat auch irgendwo ein ähnliches Beispiel wie meins in dem Wiki.

Verfasst: Donnerstag 9. Oktober 2008, 18:01
von wuf
Hallo numerix & BlackJack:

Es wird hell in meiner Höhle. Ich sehe ihr habt die besseren Stirnlampen als ich. Die Tipps sind Volltreffer! Recht vielen Dank für eure Bemühung!

Gruss wuf :wink: